Mercurial > cpython-lru_cache-weakref
annotate Objects/typeobject.c @ 66978:aed2bbafa550 3.1
Blocked revisions 87324 via svnmerge
........
r87324 | r.david.murray | 2010-12-16 14:08:51 -0500 (Thu, 16 Dec 2010) | 9 lines
#10719: restore messages generated on invalid compileall args
Before the introduction of filename arguments to compileall it gave semi useful
messages about not being able to 'list' names that weren't valid directories.
This fix restores that behavior. In addition to the test for this case, the
patch also adds a test for the default behavior of compileall when no arguments
are provided, and fixes a bug in one of the previously added tests.
........
| author | R. David Murray <rdmurray@bitdance.com> |
|---|---|
| date | Thu, 16 Dec 2010 19:10:16 +0000 |
| parents | b9e26b0c4617 |
| children | 2ea1cfdf929b |
| rev | line source |
|---|---|
| 6 | 1 /* Type object implementation */ |
| 2 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
3 #include "Python.h" |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42081
diff
changeset
|
4 #include "frameobject.h" |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5 #include "structmember.h" |
| 6 | 6 |
|
23666
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
7 #include <ctype.h> |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
8 |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
9 |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
10 /* Support type attribute cache */ |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
11 |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
12 /* The cache can keep references to the names alive for longer than |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
13 they normally would. This is why the maximum size is limited to |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
14 MCACHE_MAX_ATTR_SIZE, since it might be a problem if very large |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
15 strings are used as attribute names. */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
16 #define MCACHE_MAX_ATTR_SIZE 100 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
17 #define MCACHE_SIZE_EXP 10 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
18 #define MCACHE_HASH(version, name_hash) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
19 (((unsigned int)(version) * (unsigned int)(name_hash)) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
20 >> (8*sizeof(unsigned int) - MCACHE_SIZE_EXP)) |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
21 #define MCACHE_HASH_METHOD(type, name) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
22 MCACHE_HASH((type)->tp_version_tag, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
23 ((PyUnicodeObject *)(name))->hash) |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
24 #define MCACHE_CACHEABLE_NAME(name) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
25 PyUnicode_CheckExact(name) && \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
26 PyUnicode_GET_SIZE(name) <= MCACHE_MAX_ATTR_SIZE |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
27 |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
28 struct method_cache_entry { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
29 unsigned int version; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
30 PyObject *name; /* reference to exactly a str or None */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
31 PyObject *value; /* borrowed */ |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
32 }; |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
33 |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
34 static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP]; |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
35 static unsigned int next_version_tag = 0; |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45017
diff
changeset
|
36 |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45017
diff
changeset
|
37 unsigned int |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45017
diff
changeset
|
38 PyType_ClearCache(void) |
|
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45017
diff
changeset
|
39 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
40 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
41 unsigned int cur_version_tag = next_version_tag - 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
42 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
43 for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
44 method_cache[i].version = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
45 Py_CLEAR(method_cache[i].name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
46 method_cache[i].value = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
47 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
48 next_version_tag = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
49 /* mark all version tags as invalid */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
50 PyType_Modified(&PyBaseObject_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
51 return cur_version_tag; |
|
45026
ebfbaa1051e2
Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45017
diff
changeset
|
52 } |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
53 |
|
47557
98827a21e352
Merged revisions 63724,63726,63732,63744,63754-63755,63757-63758,63760,63775,63781-63782,63787,63805-63808,63818-63819,63823-63824 via svnmerge from
Georg Brandl <georg@python.org>
parents:
47466
diff
changeset
|
54 void |
|
98827a21e352
Merged revisions 63724,63726,63732,63744,63754-63755,63757-63758,63760,63775,63781-63782,63787,63805-63808,63818-63819,63823-63824 via svnmerge from
Georg Brandl <georg@python.org>
parents:
47466
diff
changeset
|
55 PyType_Modified(PyTypeObject *type) |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
56 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
57 /* Invalidate any cached data for the specified type and all |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
58 subclasses. This function is called after the base |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
59 classes, mro, or attributes of the type are altered. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
60 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
61 Invariants: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
62 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
63 - Py_TPFLAGS_VALID_VERSION_TAG is never set if |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
64 Py_TPFLAGS_HAVE_VERSION_TAG is not set (e.g. on type |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
65 objects coming from non-recompiled extension modules) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
66 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
67 - before Py_TPFLAGS_VALID_VERSION_TAG can be set on a type, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
68 it must first be set on all super types. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
69 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
70 This function clears the Py_TPFLAGS_VALID_VERSION_TAG of a |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
71 type (so it must first clear it on all subclasses). The |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
72 tp_version_tag value is meaningless unless this flag is set. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
73 We don't assign new version tags eagerly, but only as |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
74 needed. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
75 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
76 PyObject *raw, *ref; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
77 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
78 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
79 if (!PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
80 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
81 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
82 raw = type->tp_subclasses; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
83 if (raw != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
84 n = PyList_GET_SIZE(raw); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
85 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
86 ref = PyList_GET_ITEM(raw, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
87 ref = PyWeakref_GET_OBJECT(ref); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
88 if (ref != Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
89 PyType_Modified((PyTypeObject *)ref); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
90 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
91 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
92 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
93 type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
94 } |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
95 |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
96 static void |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
97 type_mro_modified(PyTypeObject *type, PyObject *bases) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
98 /* |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
99 Check that all base classes or elements of the mro of type are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
100 able to be cached. This function is called after the base |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
101 classes or mro of the type are altered. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
102 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
103 Unset HAVE_VERSION_TAG and VALID_VERSION_TAG if the type |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
104 inherits from an old-style class, either directly or if it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
105 appears in the MRO of a new-style class. No support either for |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
106 custom MROs that include types that are not officially super |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
107 types. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
108 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
109 Called from mro_internal, which will subsequently be called on |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
110 each subclass when their mro is recursively updated. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
111 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
112 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
113 int clear = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
114 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
115 if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
116 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
117 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
118 n = PyTuple_GET_SIZE(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
119 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
120 PyObject *b = PyTuple_GET_ITEM(bases, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
121 PyTypeObject *cls; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
122 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
123 if (!PyType_Check(b) ) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
124 clear = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
125 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
126 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
127 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
128 cls = (PyTypeObject *)b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
129 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
130 if (!PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
131 !PyType_IsSubtype(type, cls)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
132 clear = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
133 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
134 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
135 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
136 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
137 if (clear) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
138 type->tp_flags &= ~(Py_TPFLAGS_HAVE_VERSION_TAG| |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
139 Py_TPFLAGS_VALID_VERSION_TAG); |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
140 } |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
141 |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
142 static int |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
143 assign_version_tag(PyTypeObject *type) |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
144 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
145 /* Ensure that the tp_version_tag is valid and set |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
146 Py_TPFLAGS_VALID_VERSION_TAG. To respect the invariant, this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
147 must first be done on all super classes. Return 0 if this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
148 cannot be done, 1 if Py_TPFLAGS_VALID_VERSION_TAG. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
149 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
150 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
151 PyObject *bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
152 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
153 if (PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
154 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
155 if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
156 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
157 if (!PyType_HasFeature(type, Py_TPFLAGS_READY)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
158 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
159 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
160 type->tp_version_tag = next_version_tag++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
161 /* for stress-testing: next_version_tag &= 0xFF; */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
162 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
163 if (type->tp_version_tag == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
164 /* wrap-around or just starting Python - clear the whole |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
165 cache by filling names with references to Py_None. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
166 Values are also set to NULL for added protection, as they |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
167 are borrowed reference */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
168 for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
169 method_cache[i].value = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
170 Py_XDECREF(method_cache[i].name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
171 method_cache[i].name = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
172 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
173 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
174 /* mark all version tags as invalid */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
175 PyType_Modified(&PyBaseObject_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
176 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
177 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
178 bases = type->tp_bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
179 n = PyTuple_GET_SIZE(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
180 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
181 PyObject *b = PyTuple_GET_ITEM(bases, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
182 assert(PyType_Check(b)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
183 if (!assign_version_tag((PyTypeObject *)b)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
184 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
185 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
186 type->tp_flags |= Py_TPFLAGS_VALID_VERSION_TAG; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
187 return 1; |
|
44654
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
188 } |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
189 |
|
5a71dcc71eff
Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44626
diff
changeset
|
190 |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19970
diff
changeset
|
191 static PyMemberDef type_members[] = { |
|
64285
190375445241
Merged revisions 84320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64077
diff
changeset
|
192 {"__basicsize__", T_PYSSIZET, offsetof(PyTypeObject,tp_basicsize),READONLY}, |
|
190375445241
Merged revisions 84320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64077
diff
changeset
|
193 {"__itemsize__", T_PYSSIZET, offsetof(PyTypeObject, tp_itemsize), READONLY}, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
194 {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
195 {"__weakrefoffset__", T_LONG, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
196 offsetof(PyTypeObject, tp_weaklistoffset), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
197 {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
198 {"__dictoffset__", T_LONG, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
199 offsetof(PyTypeObject, tp_dictoffset), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
200 {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
201 {0} |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
202 }; |
| 6 | 203 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
204 static PyObject * |
|
19300
81440dd326bb
Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents:
19297
diff
changeset
|
205 type_name(PyTypeObject *type, void *context) |
|
81440dd326bb
Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents:
19297
diff
changeset
|
206 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
207 const char *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
208 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
209 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
210 PyHeapTypeObject* et = (PyHeapTypeObject*)type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
211 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
212 Py_INCREF(et->ht_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
213 return et->ht_name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
214 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
215 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
216 s = strrchr(type->tp_name, '.'); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
217 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
218 s = type->tp_name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
219 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
220 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
221 return PyUnicode_FromString(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
222 } |
|
19300
81440dd326bb
Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents:
19297
diff
changeset
|
223 } |
|
81440dd326bb
Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents:
19297
diff
changeset
|
224 |
| 26421 | 225 static int |
| 226 type_set_name(PyTypeObject *type, PyObject *value, void *context) | |
| 227 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
228 PyHeapTypeObject* et; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
229 char *tp_name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
230 PyObject *tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
231 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
232 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
233 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
234 "can't set %s.__name__", type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
235 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
236 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
237 if (!value) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
238 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
239 "can't delete %s.__name__", type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
240 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
241 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
242 if (!PyUnicode_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
243 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
244 "can only assign string to %s.__name__, not '%s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
245 type->tp_name, Py_TYPE(value)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
246 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
247 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
248 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
249 /* Check absence of null characters */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
250 tmp = PyUnicode_FromStringAndSize("\0", 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
251 if (tmp == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
252 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
253 if (PyUnicode_Contains(value, tmp) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
254 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
255 PyErr_Format(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
256 "__name__ must not contain null bytes"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
257 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
258 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
259 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
260 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
261 tp_name = _PyUnicode_AsString(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
262 if (tp_name == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
263 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
264 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
265 et = (PyHeapTypeObject*)type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
266 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
267 Py_INCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
268 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
269 Py_DECREF(et->ht_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
270 et->ht_name = value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
271 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
272 type->tp_name = tp_name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
273 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
274 return 0; |
| 26421 | 275 } |
| 276 | |
|
19300
81440dd326bb
Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents:
19297
diff
changeset
|
277 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
278 type_module(PyTypeObject *type, void *context) |
|
2080
c21cc7b3ce28
added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
279 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
280 PyObject *mod; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
281 char *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
282 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
283 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
284 mod = PyDict_GetItemString(type->tp_dict, "__module__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
285 if (!mod) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
286 PyErr_Format(PyExc_AttributeError, "__module__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
287 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
288 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
289 Py_XINCREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
290 return mod; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
291 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
292 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
293 s = strrchr(type->tp_name, '.'); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
294 if (s != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
295 return PyUnicode_FromStringAndSize( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
296 type->tp_name, (Py_ssize_t)(s - type->tp_name)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
297 return PyUnicode_FromString("builtins"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
298 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
299 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
300 |
|
20084
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
301 static int |
|
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
302 type_set_module(PyTypeObject *type, PyObject *value, void *context) |
|
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
303 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
304 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
305 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
306 "can't set %s.__module__", type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
307 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
308 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
309 if (!value) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
310 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
311 "can't delete %s.__module__", type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
312 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
313 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
314 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
315 PyType_Modified(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
316 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
317 return PyDict_SetItemString(type->tp_dict, "__module__", value); |
|
20084
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
318 } |
|
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
319 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
320 static PyObject * |
|
45549
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
321 type_abstractmethods(PyTypeObject *type, void *context) |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
322 { |
|
65066
394e25382a59
Merged revisions 85154,85182 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64916
diff
changeset
|
323 PyObject *mod = NULL; |
|
65069
b9e26b0c4617
Merged revisions 85193 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
65066
diff
changeset
|
324 /* type itself has an __abstractmethods__ descriptor (this). Don't return |
|
b9e26b0c4617
Merged revisions 85193 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
65066
diff
changeset
|
325 that. */ |
|
65066
394e25382a59
Merged revisions 85154,85182 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64916
diff
changeset
|
326 if (type != &PyType_Type) |
|
394e25382a59
Merged revisions 85154,85182 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64916
diff
changeset
|
327 mod = PyDict_GetItemString(type->tp_dict, "__abstractmethods__"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
328 if (!mod) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
329 PyErr_Format(PyExc_AttributeError, "__abstractmethods__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
330 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
331 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
332 Py_XINCREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
333 return mod; |
|
45549
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
334 } |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
335 |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
336 static int |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
337 type_set_abstractmethods(PyTypeObject *type, PyObject *value, void *context) |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
338 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
339 /* __abstractmethods__ should only be set once on a type, in |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
340 abc.ABCMeta.__new__, so this function doesn't do anything |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
341 special to update subclasses. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
342 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
343 int res = PyDict_SetItemString(type->tp_dict, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
344 "__abstractmethods__", value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
345 if (res == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
346 PyType_Modified(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
347 if (value && PyObject_IsTrue(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
348 type->tp_flags |= Py_TPFLAGS_IS_ABSTRACT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
349 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
350 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
351 type->tp_flags &= ~Py_TPFLAGS_IS_ABSTRACT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
352 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
353 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
354 return res; |
|
45549
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
355 } |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
356 |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
357 static PyObject * |
| 26421 | 358 type_get_bases(PyTypeObject *type, void *context) |
| 359 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
360 Py_INCREF(type->tp_bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
361 return type->tp_bases; |
| 26421 | 362 } |
| 363 | |
| 364 static PyTypeObject *best_base(PyObject *); | |
| 365 static int mro_internal(PyTypeObject *); | |
| 366 static int compatible_for_assignment(PyTypeObject *, PyTypeObject *, char *); | |
| 367 static int add_subclass(PyTypeObject*, PyTypeObject*); | |
| 368 static void remove_subclass(PyTypeObject *, PyTypeObject *); | |
| 369 static void update_all_slots(PyTypeObject *); | |
| 370 | |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
371 typedef int (*update_callback)(PyTypeObject *, void *); |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
372 static int update_subclasses(PyTypeObject *type, PyObject *name, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
373 update_callback callback, void *data); |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
374 static int recurse_down_subclasses(PyTypeObject *type, PyObject *name, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
375 update_callback callback, void *data); |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
376 |
| 26421 | 377 static int |
|
26445
7421367274b4
Readjustments to the way we cope with exceptions from subclasses'
Michael W. Hudson <mwh@python.net>
parents:
26440
diff
changeset
|
378 mro_subclasses(PyTypeObject *type, PyObject* temp) |
| 26421 | 379 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
380 PyTypeObject *subclass; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
381 PyObject *ref, *subclasses, *old_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
382 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
383 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
384 subclasses = type->tp_subclasses; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
385 if (subclasses == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
386 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
387 assert(PyList_Check(subclasses)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
388 n = PyList_GET_SIZE(subclasses); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
389 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
390 ref = PyList_GET_ITEM(subclasses, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
391 assert(PyWeakref_CheckRef(ref)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
392 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
393 assert(subclass != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
394 if ((PyObject *)subclass == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
395 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
396 assert(PyType_Check(subclass)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
397 old_mro = subclass->tp_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
398 if (mro_internal(subclass) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
399 subclass->tp_mro = old_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
400 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
401 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
402 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
403 PyObject* tuple; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
404 tuple = PyTuple_Pack(2, subclass, old_mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
405 Py_DECREF(old_mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
406 if (!tuple) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
407 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
408 if (PyList_Append(temp, tuple) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
409 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
410 Py_DECREF(tuple); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
411 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
412 if (mro_subclasses(subclass, temp) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
413 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
414 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
415 return 0; |
| 26421 | 416 } |
| 417 | |
| 418 static int | |
| 419 type_set_bases(PyTypeObject *type, PyObject *value, void *context) | |
| 420 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
421 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
422 int r = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
423 PyObject *ob, *temp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
424 PyTypeObject *new_base, *old_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
425 PyObject *old_bases, *old_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
426 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
427 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
428 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
429 "can't set %s.__bases__", type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
430 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
431 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
432 if (!value) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
433 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
434 "can't delete %s.__bases__", type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
435 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
436 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
437 if (!PyTuple_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
438 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
439 "can only assign tuple to %s.__bases__, not %s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
440 type->tp_name, Py_TYPE(value)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
441 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
442 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
443 if (PyTuple_GET_SIZE(value) == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
444 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
445 "can only assign non-empty tuple to %s.__bases__, not ()", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
446 type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
447 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
448 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
449 for (i = 0; i < PyTuple_GET_SIZE(value); i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
450 ob = PyTuple_GET_ITEM(value, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
451 if (!PyType_Check(ob)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
452 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
453 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
454 "%s.__bases__ must be tuple of old- or new-style classes, not '%s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
455 type->tp_name, Py_TYPE(ob)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
456 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
457 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
458 if (PyType_Check(ob)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
459 if (PyType_IsSubtype((PyTypeObject*)ob, type)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
460 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
461 "a __bases__ item causes an inheritance cycle"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
462 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
463 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
464 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
465 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
466 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
467 new_base = best_base(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
468 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
469 if (!new_base) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
470 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
471 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
472 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
473 if (!compatible_for_assignment(type->tp_base, new_base, "__bases__")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
474 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
475 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
476 Py_INCREF(new_base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
477 Py_INCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
478 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
479 old_bases = type->tp_bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
480 old_base = type->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
481 old_mro = type->tp_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
482 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
483 type->tp_bases = value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
484 type->tp_base = new_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
485 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
486 if (mro_internal(type) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
487 goto bail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
488 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
489 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
490 temp = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
491 if (!temp) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
492 goto bail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
493 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
494 r = mro_subclasses(type, temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
495 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
496 if (r < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
497 for (i = 0; i < PyList_Size(temp); i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
498 PyTypeObject* cls; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
499 PyObject* mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
500 PyArg_UnpackTuple(PyList_GET_ITEM(temp, i), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
501 "", 2, 2, &cls, &mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
502 Py_INCREF(mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
503 ob = cls->tp_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
504 cls->tp_mro = mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
505 Py_DECREF(ob); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
506 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
507 Py_DECREF(temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
508 goto bail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
509 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
510 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
511 Py_DECREF(temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
512 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
513 /* any base that was in __bases__ but now isn't, we |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
514 need to remove |type| from its tp_subclasses. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
515 conversely, any class now in __bases__ that wasn't |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
516 needs to have |type| added to its subclasses. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
517 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
518 /* for now, sod that: just remove from all old_bases, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
519 add to all new_bases */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
520 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
521 for (i = PyTuple_GET_SIZE(old_bases) - 1; i >= 0; i--) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
522 ob = PyTuple_GET_ITEM(old_bases, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
523 if (PyType_Check(ob)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
524 remove_subclass( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
525 (PyTypeObject*)ob, type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
526 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
527 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
528 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
529 for (i = PyTuple_GET_SIZE(value) - 1; i >= 0; i--) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
530 ob = PyTuple_GET_ITEM(value, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
531 if (PyType_Check(ob)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
532 if (add_subclass((PyTypeObject*)ob, type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
533 r = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
534 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
535 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
536 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
537 update_all_slots(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
538 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
539 Py_DECREF(old_bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
540 Py_DECREF(old_base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
541 Py_DECREF(old_mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
542 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
543 return r; |
|
26446
7777dceb66ee
I don't know why staring at the email to python-checkins made me
Michael W. Hudson <mwh@python.net>
parents:
26445
diff
changeset
|
544 |
|
7777dceb66ee
I don't know why staring at the email to python-checkins made me
Michael W. Hudson <mwh@python.net>
parents:
26445
diff
changeset
|
545 bail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
546 Py_DECREF(type->tp_bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
547 Py_DECREF(type->tp_base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
548 if (type->tp_mro != old_mro) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
549 Py_DECREF(type->tp_mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
550 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
551 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
552 type->tp_bases = old_bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
553 type->tp_base = old_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
554 type->tp_mro = old_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
555 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
556 return -1; |
| 26421 | 557 } |
| 558 | |
| 559 static PyObject * | |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
560 type_dict(PyTypeObject *type, void *context) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
561 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
562 if (type->tp_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
563 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
564 return Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
565 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
566 return PyDictProxy_New(type->tp_dict); |
|
2080
c21cc7b3ce28
added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
567 } |
|
c21cc7b3ce28
added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents:
2059
diff
changeset
|
568 |
|
22348
51aa9eb24d81
SF patch 530070: pydoc regression, from Martin and Guido.
Tim Peters <tim.peters@gmail.com>
parents:
22331
diff
changeset
|
569 static PyObject * |
|
51aa9eb24d81
SF patch 530070: pydoc regression, from Martin and Guido.
Tim Peters <tim.peters@gmail.com>
parents:
22331
diff
changeset
|
570 type_get_doc(PyTypeObject *type, void *context) |
|
51aa9eb24d81
SF patch 530070: pydoc regression, from Martin and Guido.
Tim Peters <tim.peters@gmail.com>
parents:
22331
diff
changeset
|
571 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
572 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
573 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
574 return PyUnicode_FromString(type->tp_doc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
575 result = PyDict_GetItemString(type->tp_dict, "__doc__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
576 if (result == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
577 result = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
578 Py_INCREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
579 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
580 else if (Py_TYPE(result)->tp_descr_get) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
581 result = Py_TYPE(result)->tp_descr_get(result, NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
582 (PyObject *)type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
583 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
584 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
585 Py_INCREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
586 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
587 return result; |
|
22348
51aa9eb24d81
SF patch 530070: pydoc regression, from Martin and Guido.
Tim Peters <tim.peters@gmail.com>
parents:
22331
diff
changeset
|
588 } |
|
51aa9eb24d81
SF patch 530070: pydoc regression, from Martin and Guido.
Tim Peters <tim.peters@gmail.com>
parents:
22331
diff
changeset
|
589 |
|
48875
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
590 static PyObject * |
|
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
591 type___instancecheck__(PyObject *type, PyObject *inst) |
|
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
592 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
593 switch (_PyObject_RealIsInstance(inst, type)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
594 case -1: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
595 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
596 case 0: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
597 Py_RETURN_FALSE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
598 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
599 Py_RETURN_TRUE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
600 } |
|
48875
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
601 } |
|
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
602 |
|
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
603 |
|
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
604 static PyObject * |
|
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
605 type___subclasscheck__(PyObject *type, PyObject *inst) |
|
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
606 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
607 switch (_PyObject_RealIsSubclass(inst, type)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
608 case -1: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
609 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
610 case 0: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
611 Py_RETURN_FALSE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
612 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
613 Py_RETURN_TRUE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
614 } |
|
48875
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
615 } |
|
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
616 |
|
d6e86a96f9b3
Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents:
48660
diff
changeset
|
617 |
|
20595
c4d9d8674506
Add missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
20586
diff
changeset
|
618 static PyGetSetDef type_getsets[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
619 {"__name__", (getter)type_name, (setter)type_set_name, NULL}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
620 {"__bases__", (getter)type_get_bases, (setter)type_set_bases, NULL}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
621 {"__module__", (getter)type_module, (setter)type_set_module, NULL}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
622 {"__abstractmethods__", (getter)type_abstractmethods, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
623 (setter)type_set_abstractmethods, NULL}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
624 {"__dict__", (getter)type_dict, NULL, NULL}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
625 {"__doc__", (getter)type_get_doc, NULL, NULL}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
626 {0} |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
627 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
628 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
629 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
630 type_repr(PyTypeObject *type) |
| 6 | 631 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
632 PyObject *mod, *name, *rtn; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
633 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
634 mod = type_module(type, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
635 if (mod == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
636 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
637 else if (!PyUnicode_Check(mod)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
638 Py_DECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
639 mod = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
640 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
641 name = type_name(type, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
642 if (name == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
643 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
644 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
645 if (mod != NULL && PyUnicode_CompareWithASCIIString(mod, "builtins")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
646 rtn = PyUnicode_FromFormat("<class '%U.%U'>", mod, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
647 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
648 rtn = PyUnicode_FromFormat("<class '%s'>", type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
649 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
650 Py_XDECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
651 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
652 return rtn; |
| 6 | 653 } |
| 654 | |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
655 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
656 type_call(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
657 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
658 PyObject *obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
659 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
660 if (type->tp_new == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
661 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
662 "cannot create '%.100s' instances", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
663 type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
664 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
665 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
666 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
667 obj = type->tp_new(type, args, kwds); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
668 if (obj != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
669 /* Ugly exception: when the call was type(something), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
670 don't call tp_init on the result. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
671 if (type == &PyType_Type && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
672 PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
673 (kwds == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
674 (PyDict_Check(kwds) && PyDict_Size(kwds) == 0))) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
675 return obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
676 /* If the returned object is not an instance of type, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
677 it won't be initialized. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
678 if (!PyType_IsSubtype(Py_TYPE(obj), type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
679 return obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
680 type = Py_TYPE(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
681 if (type->tp_init != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
682 type->tp_init(obj, args, kwds) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
683 Py_DECREF(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
684 obj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
685 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
686 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
687 return obj; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
688 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
689 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
690 PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36169
diff
changeset
|
691 PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
692 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
693 PyObject *obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
694 const size_t size = _PyObject_VAR_SIZE(type, nitems+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
695 /* note that we need to add one, for the sentinel */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
696 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
697 if (PyType_IS_GC(type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
698 obj = _PyObject_GC_Malloc(size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
699 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
700 obj = (PyObject *)PyObject_MALLOC(size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
701 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
702 if (obj == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
703 return PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
704 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
705 memset(obj, '\0', size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
706 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
707 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
708 Py_INCREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
709 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
710 if (type->tp_itemsize == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
711 PyObject_INIT(obj, type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
712 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
713 (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
714 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
715 if (PyType_IS_GC(type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
716 _PyObject_GC_TRACK(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
717 return obj; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
718 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
719 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
720 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
721 PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
722 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
723 return type->tp_alloc(type, 0); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
724 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
725 |
|
20277
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
20259
diff
changeset
|
726 /* Helpers for subtyping */ |
|
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
20259
diff
changeset
|
727 |
|
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
20259
diff
changeset
|
728 static int |
|
23666
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
729 traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg) |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
730 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
731 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
732 PyMemberDef *mp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
733 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
734 n = Py_SIZE(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
735 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
736 for (i = 0; i < n; i++, mp++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
737 if (mp->type == T_OBJECT_EX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
738 char *addr = (char *)self + mp->offset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
739 PyObject *obj = *(PyObject **)addr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
740 if (obj != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
741 int err = visit(obj, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
742 if (err) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
743 return err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
744 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
745 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
746 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
747 return 0; |
|
23666
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
748 } |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
749 |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
750 static int |
|
20277
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
20259
diff
changeset
|
751 subtype_traverse(PyObject *self, visitproc visit, void *arg) |
|
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
20259
diff
changeset
|
752 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
753 PyTypeObject *type, *base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
754 traverseproc basetraverse; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
755 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
756 /* Find the nearest base with a different tp_traverse, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
757 and traverse slots while we're at it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
758 type = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
759 base = type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
760 while ((basetraverse = base->tp_traverse) == subtype_traverse) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
761 if (Py_SIZE(base)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
762 int err = traverse_slots(base, self, visit, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
763 if (err) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
764 return err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
765 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
766 base = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
767 assert(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
768 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
769 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
770 if (type->tp_dictoffset != base->tp_dictoffset) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
771 PyObject **dictptr = _PyObject_GetDictPtr(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
772 if (dictptr && *dictptr) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
773 Py_VISIT(*dictptr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
774 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
775 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
776 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
777 /* For a heaptype, the instances count as references |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
778 to the type. Traverse the type so the collector |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
779 can find cycles involving this link. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
780 Py_VISIT(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
781 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
782 if (basetraverse) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
783 return basetraverse(self, visit, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
784 return 0; |
|
23666
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
785 } |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
786 |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
787 static void |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
788 clear_slots(PyTypeObject *type, PyObject *self) |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
789 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
790 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
791 PyMemberDef *mp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
792 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
793 n = Py_SIZE(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
794 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
795 for (i = 0; i < n; i++, mp++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
796 if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
797 char *addr = (char *)self + mp->offset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
798 PyObject *obj = *(PyObject **)addr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
799 if (obj != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
800 *(PyObject **)addr = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
801 Py_DECREF(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
802 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
803 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
804 } |
|
23666
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
805 } |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
806 |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
807 static int |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
808 subtype_clear(PyObject *self) |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
809 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
810 PyTypeObject *type, *base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
811 inquiry baseclear; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
812 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
813 /* Find the nearest base with a different tp_clear |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
814 and clear slots while we're at it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
815 type = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
816 base = type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
817 while ((baseclear = base->tp_clear) == subtype_clear) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
818 if (Py_SIZE(base)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
819 clear_slots(base, self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
820 base = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
821 assert(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
822 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
823 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
824 /* There's no need to clear the instance dict (if any); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
825 the collector will call its tp_clear handler. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
826 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
827 if (baseclear) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
828 return baseclear(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
829 return 0; |
|
20277
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
20259
diff
changeset
|
830 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
831 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
832 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
833 subtype_dealloc(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
834 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
835 PyTypeObject *type, *base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
836 destructor basedealloc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
837 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
838 /* Extract the type; we expect it to be a heap type */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
839 type = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
840 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
841 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
842 /* Test whether the type has GC exactly once */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
843 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
844 if (!PyType_IS_GC(type)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
845 /* It's really rare to find a dynamic type that doesn't have |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
846 GC; it can only happen when deriving from 'object' and not |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
847 adding any slots or instance variables. This allows |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
848 certain simplifications: there's no need to call |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
849 clear_slots(), or DECREF the dict, or clear weakrefs. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
850 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
851 /* Maybe call finalizer; exit early if resurrected */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
852 if (type->tp_del) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
853 type->tp_del(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
854 if (self->ob_refcnt > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
855 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
856 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
857 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
858 /* Find the nearest base with a different tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
859 base = type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
860 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
861 assert(Py_SIZE(base) == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
862 base = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
863 assert(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
864 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
865 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
866 /* Extract the type again; tp_del may have changed it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
867 type = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
868 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
869 /* Call the base tp_dealloc() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
870 assert(basedealloc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
871 basedealloc(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
872 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
873 /* Can't reference self beyond this point */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
874 Py_DECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
875 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
876 /* Done */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
877 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
878 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
879 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
880 /* We get here only if the type has GC */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
881 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
882 /* UnTrack and re-Track around the trashcan macro, alas */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
883 /* See explanation at end of function for full disclosure */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
884 PyObject_GC_UnTrack(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
885 ++_PyTrash_delete_nesting; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
886 Py_TRASHCAN_SAFE_BEGIN(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
887 --_PyTrash_delete_nesting; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
888 /* DO NOT restore GC tracking at this point. weakref callbacks |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
889 * (if any, and whether directly here or indirectly in something we |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
890 * call) may trigger GC, and if self is tracked at that point, it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
891 * will look like trash to GC and GC will try to delete self again. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
892 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
893 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
894 /* Find the nearest base with a different tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
895 base = type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
896 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
897 base = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
898 assert(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
899 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
900 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
901 /* If we added a weaklist, we clear it. Do this *before* calling |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
902 the finalizer (__del__), clearing slots, or clearing the instance |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
903 dict. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
904 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
905 if (type->tp_weaklistoffset && !base->tp_weaklistoffset) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
906 PyObject_ClearWeakRefs(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
907 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
908 /* Maybe call finalizer; exit early if resurrected */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
909 if (type->tp_del) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
910 _PyObject_GC_TRACK(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
911 type->tp_del(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
912 if (self->ob_refcnt > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
913 goto endlabel; /* resurrected */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
914 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
915 _PyObject_GC_UNTRACK(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
916 /* New weakrefs could be created during the finalizer call. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
917 If this occurs, clear them out without calling their |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
918 finalizers since they might rely on part of the object |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
919 being finalized that has already been destroyed. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
920 if (type->tp_weaklistoffset && !base->tp_weaklistoffset) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
921 /* Modeled after GET_WEAKREFS_LISTPTR() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
922 PyWeakReference **list = (PyWeakReference **) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
923 PyObject_GET_WEAKREFS_LISTPTR(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
924 while (*list) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
925 _PyWeakref_ClearRef(*list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
926 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
927 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
928 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
929 /* Clear slots up to the nearest base with a different tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
930 base = type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
931 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
932 if (Py_SIZE(base)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
933 clear_slots(base, self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
934 base = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
935 assert(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
936 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
937 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
938 /* If we added a dict, DECREF it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
939 if (type->tp_dictoffset && !base->tp_dictoffset) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
940 PyObject **dictptr = _PyObject_GetDictPtr(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
941 if (dictptr != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
942 PyObject *dict = *dictptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
943 if (dict != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
944 Py_DECREF(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
945 *dictptr = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
946 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
947 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
948 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
949 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
950 /* Extract the type again; tp_del may have changed it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
951 type = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
952 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
953 /* Call the base tp_dealloc(); first retrack self if |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
954 * basedealloc knows about gc. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
955 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
956 if (PyType_IS_GC(base)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
957 _PyObject_GC_TRACK(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
958 assert(basedealloc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
959 basedealloc(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
960 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
961 /* Can't reference self beyond this point */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
962 Py_DECREF(type); |
|
24614
40eb80dc4250
Fix SF bug 574207 (chained __slots__ dealloc segfault).
Guido van Rossum <guido@python.org>
parents:
24460
diff
changeset
|
963 |
|
24653
1ab27c1770df
Fix a subtle bug in the trashcan code I added yesterday to
Guido van Rossum <guido@python.org>
parents:
24614
diff
changeset
|
964 endlabel: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
965 ++_PyTrash_delete_nesting; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
966 Py_TRASHCAN_SAFE_END(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
967 --_PyTrash_delete_nesting; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
968 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
969 /* Explanation of the weirdness around the trashcan macros: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
970 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
971 Q. What do the trashcan macros do? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
972 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
973 A. Read the comment titled "Trashcan mechanism" in object.h. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
974 For one, this explains why there must be a call to GC-untrack |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
975 before the trashcan begin macro. Without understanding the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
976 trashcan code, the answers to the following questions don't make |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
977 sense. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
978 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
979 Q. Why do we GC-untrack before the trashcan and then immediately |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
980 GC-track again afterward? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
981 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
982 A. In the case that the base class is GC-aware, the base class |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
983 probably GC-untracks the object. If it does that using the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
984 UNTRACK macro, this will crash when the object is already |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
985 untracked. Because we don't know what the base class does, the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
986 only safe thing is to make sure the object is tracked when we |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
987 call the base class dealloc. But... The trashcan begin macro |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
988 requires that the object is *untracked* before it is called. So |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
989 the dance becomes: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
990 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
991 GC untrack |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
992 trashcan begin |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
993 GC track |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
994 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
995 Q. Why did the last question say "immediately GC-track again"? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
996 It's nowhere near immediately. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
997 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
998 A. Because the code *used* to re-track immediately. Bad Idea. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
999 self has a refcount of 0, and if gc ever gets its hands on it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1000 (which can happen if any weakref callback gets invoked), it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1001 looks like trash to gc too, and gc also tries to delete self |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1002 then. But we're already deleting self. Double dealloction is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1003 a subtle disaster. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1004 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1005 Q. Why the bizarre (net-zero) manipulation of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1006 _PyTrash_delete_nesting around the trashcan macros? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1007 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1008 A. Some base classes (e.g. list) also use the trashcan mechanism. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1009 The following scenario used to be possible: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1010 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1011 - suppose the trashcan level is one below the trashcan limit |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1012 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1013 - subtype_dealloc() is called |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1014 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1015 - the trashcan limit is not yet reached, so the trashcan level |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1016 is incremented and the code between trashcan begin and end is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1017 executed |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1018 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1019 - this destroys much of the object's contents, including its |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1020 slots and __dict__ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1021 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1022 - basedealloc() is called; this is really list_dealloc(), or |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1023 some other type which also uses the trashcan macros |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1024 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1025 - the trashcan limit is now reached, so the object is put on the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1026 trashcan's to-be-deleted-later list |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1027 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1028 - basedealloc() returns |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1029 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1030 - subtype_dealloc() decrefs the object's type |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1031 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1032 - subtype_dealloc() returns |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1033 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1034 - later, the trashcan code starts deleting the objects from its |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1035 to-be-deleted-later list |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1036 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1037 - subtype_dealloc() is called *AGAIN* for the same object |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1038 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1039 - at the very least (if the destroyed slots and __dict__ don't |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1040 cause problems) the object's type gets decref'ed a second |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1041 time, which is *BAD*!!! |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1042 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1043 The remedy is to make sure that if the code between trashcan |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1044 begin and end in subtype_dealloc() is called, the code between |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1045 trashcan begin and end in basedealloc() will also be called. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1046 This is done by decrementing the level after passing into the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1047 trashcan block, and incrementing it just before leaving the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1048 block. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1049 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1050 But now it's possible that a chain of objects consisting solely |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1051 of objects whose deallocator is subtype_dealloc() will defeat |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1052 the trashcan mechanism completely: the decremented level means |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1053 that the effective level never reaches the limit. Therefore, we |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1054 *increment* the level *before* entering the trashcan block, and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1055 matchingly decrement it after leaving. This means the trashcan |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1056 code will trigger a little early, but that's no big deal. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1057 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1058 Q. Are there any live examples of code in need of all this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1059 complexity? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1060 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1061 A. Yes. See SF bug 668433 for code that crashed (when Python was |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1062 compiled in debug mode) before the trashcan level manipulations |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1063 were added. For more discussion, see SF patches 581742, 575073 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1064 and bug 574207. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1065 */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1066 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1067 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24250
diff
changeset
|
1068 static PyTypeObject *solid_base(PyTypeObject *type); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1069 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1070 /* type test with subclassing support */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1071 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1072 int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1073 PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1074 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1075 PyObject *mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1076 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1077 mro = a->tp_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1078 if (mro != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1079 /* Deal with multiple inheritance without recursion |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1080 by walking the MRO tuple */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1081 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1082 assert(PyTuple_Check(mro)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1083 n = PyTuple_GET_SIZE(mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1084 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1085 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1086 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1087 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1088 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1089 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1090 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1091 /* a is not completely initilized yet; follow tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1092 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1093 if (a == b) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1094 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1095 a = a->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1096 } while (a != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1097 return b == &PyBaseObject_Type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1098 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1099 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1100 |
|
19913
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1101 /* Internal routines to do a method lookup in the type |
|
19535
9753608e2d57
Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents:
19476
diff
changeset
|
1102 without looking in the instance dictionary |
|
9753608e2d57
Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents:
19476
diff
changeset
|
1103 (so we can't use PyObject_GetAttr) but still binding |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1104 it to the instance. The arguments are the object, |
|
19535
9753608e2d57
Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents:
19476
diff
changeset
|
1105 the method name as a C string, and the address of a |
|
19913
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1106 static variable used to cache the interned Python string. |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1107 |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1108 Two variants: |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1109 |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1110 - lookup_maybe() returns NULL without raising an exception |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1111 when the _PyType_Lookup() call fails; |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1112 |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1113 - lookup_method() always raises an exception upon errors. |
|
53905
2993f049e2c9
Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53374
diff
changeset
|
1114 |
|
2993f049e2c9
Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53374
diff
changeset
|
1115 - _PyObject_LookupSpecial() exported for the benefit of other places. |
|
19913
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1116 */ |
|
19535
9753608e2d57
Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents:
19476
diff
changeset
|
1117 |
|
9753608e2d57
Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents:
19476
diff
changeset
|
1118 static PyObject * |
|
19913
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1119 lookup_maybe(PyObject *self, char *attrstr, PyObject **attrobj) |
|
19535
9753608e2d57
Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents:
19476
diff
changeset
|
1120 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1121 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1122 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1123 if (*attrobj == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1124 *attrobj = PyUnicode_InternFromString(attrstr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1125 if (*attrobj == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1126 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1127 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1128 res = _PyType_Lookup(Py_TYPE(self), *attrobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1129 if (res != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1130 descrgetfunc f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1131 if ((f = Py_TYPE(res)->tp_descr_get) == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1132 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1133 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1134 res = f(res, self, (PyObject *)(Py_TYPE(self))); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1135 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1136 return res; |
|
19535
9753608e2d57
Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents:
19476
diff
changeset
|
1137 } |
|
9753608e2d57
Change in policy: when a slot_tp_xxx function looks for the __xxx__ method,
Guido van Rossum <guido@python.org>
parents:
19476
diff
changeset
|
1138 |
|
19913
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1139 static PyObject * |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1140 lookup_method(PyObject *self, char *attrstr, PyObject **attrobj) |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1141 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1142 PyObject *res = lookup_maybe(self, attrstr, attrobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1143 if (res == NULL && !PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1144 PyErr_SetObject(PyExc_AttributeError, *attrobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1145 return res; |
|
19913
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1146 } |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1147 |
|
53905
2993f049e2c9
Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53374
diff
changeset
|
1148 PyObject * |
|
2993f049e2c9
Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53374
diff
changeset
|
1149 _PyObject_LookupSpecial(PyObject *self, char *attrstr, PyObject **attrobj) |
|
2993f049e2c9
Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53374
diff
changeset
|
1150 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1151 return lookup_maybe(self, attrstr, attrobj); |
|
53905
2993f049e2c9
Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53374
diff
changeset
|
1152 } |
|
2993f049e2c9
Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53374
diff
changeset
|
1153 |
|
19538
b4a3fc147929
Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents:
19535
diff
changeset
|
1154 /* A variation of PyObject_CallMethod that uses lookup_method() |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1155 instead of PyObject_GetAttrString(). This uses the same convention |
|
19538
b4a3fc147929
Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents:
19535
diff
changeset
|
1156 as lookup_method to cache the interned name string object. */ |
|
b4a3fc147929
Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents:
19535
diff
changeset
|
1157 |
|
20595
c4d9d8674506
Add missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
20586
diff
changeset
|
1158 static PyObject * |
|
19538
b4a3fc147929
Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents:
19535
diff
changeset
|
1159 call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...) |
|
b4a3fc147929
Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents:
19535
diff
changeset
|
1160 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1161 va_list va; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1162 PyObject *args, *func = 0, *retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1163 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1164 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1165 func = lookup_maybe(o, name, nameobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1166 if (func == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1167 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1168 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1169 PyErr_SetObject(PyExc_AttributeError, *nameobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1170 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1171 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1172 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1173 if (format && *format) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1174 args = Py_VaBuildValue(format, va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1175 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1176 args = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1177 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1178 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1179 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1180 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1181 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1182 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1183 assert(PyTuple_Check(args)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1184 retval = PyObject_Call(func, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1185 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1186 Py_DECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1187 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1188 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1189 return retval; |
|
19913
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1190 } |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1191 |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1192 /* Clone of call_method() that returns NotImplemented when the lookup fails. */ |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1193 |
|
20595
c4d9d8674506
Add missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
20586
diff
changeset
|
1194 static PyObject * |
|
19913
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1195 call_maybe(PyObject *o, char *name, PyObject **nameobj, char *format, ...) |
|
ca0f54dacdd8
Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents:
19911
diff
changeset
|
1196 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1197 va_list va; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1198 PyObject *args, *func = 0, *retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1199 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1200 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1201 func = lookup_maybe(o, name, nameobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1202 if (func == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1203 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1204 if (!PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1205 Py_INCREF(Py_NotImplemented); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1206 return Py_NotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1207 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1208 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1209 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1210 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1211 if (format && *format) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1212 args = Py_VaBuildValue(format, va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1213 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1214 args = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1215 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1216 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1217 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1218 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1219 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1220 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1221 assert(PyTuple_Check(args)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1222 retval = PyObject_Call(func, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1223 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1224 Py_DECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1225 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1226 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1227 return retval; |
|
19538
b4a3fc147929
Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents:
19535
diff
changeset
|
1228 } |
|
b4a3fc147929
Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents:
19535
diff
changeset
|
1229 |
|
26575
93b5ca9423eb
slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents:
26559
diff
changeset
|
1230 /* |
|
26222
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1231 Method resolution order algorithm C3 described in |
|
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1232 "A Monotonic Superclass Linearization for Dylan", |
|
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1233 by Kim Barrett, Bob Cassel, Paul Haahr, |
|
26575
93b5ca9423eb
slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents:
26559
diff
changeset
|
1234 David A. Moon, Keith Playford, and P. Tucker Withington. |
|
26222
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1235 (OOPSLA 1996) |
|
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1236 |
|
26410
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1237 Some notes about the rules implied by C3: |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1238 |
|
26575
93b5ca9423eb
slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents:
26559
diff
changeset
|
1239 No duplicate bases. |
|
26410
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1240 It isn't legal to repeat a class in a list of base classes. |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1241 |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1242 The next three properties are the 3 constraints in "C3". |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1243 |
|
26575
93b5ca9423eb
slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents:
26559
diff
changeset
|
1244 Local precendece order. |
|
26410
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1245 If A precedes B in C's MRO, then A will precede B in the MRO of all |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1246 subclasses of C. |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1247 |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1248 Monotonicity. |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1249 The MRO of a class must be an extension without reordering of the |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1250 MRO of each of its superclasses. |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1251 |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1252 Extended Precedence Graph (EPG). |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1253 Linearization is consistent if there is a path in the EPG from |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1254 each class to all its successors in the linearization. See |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1255 the paper for definition of EPG. |
|
26222
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1256 */ |
|
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1257 |
|
26575
93b5ca9423eb
slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents:
26559
diff
changeset
|
1258 static int |
|
26222
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1259 tail_contains(PyObject *list, int whence, PyObject *o) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1260 Py_ssize_t j, size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1261 size = PyList_GET_SIZE(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1262 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1263 for (j = whence+1; j < size; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1264 if (PyList_GET_ITEM(list, j) == o) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1265 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1266 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1267 return 0; |
|
26222
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1268 } |
|
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1269 |
|
26410
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1270 static PyObject * |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1271 class_name(PyObject *cls) |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1272 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1273 PyObject *name = PyObject_GetAttrString(cls, "__name__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1274 if (name == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1275 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1276 Py_XDECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1277 name = PyObject_Repr(cls); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1278 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1279 if (name == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1280 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1281 if (!PyUnicode_Check(name)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1282 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1283 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1284 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1285 return name; |
|
26410
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1286 } |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1287 |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1288 static int |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1289 check_duplicates(PyObject *list) |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1290 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1291 Py_ssize_t i, j, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1292 /* Let's use a quadratic time algorithm, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1293 assuming that the bases lists is short. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1294 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1295 n = PyList_GET_SIZE(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1296 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1297 PyObject *o = PyList_GET_ITEM(list, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1298 for (j = i + 1; j < n; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1299 if (PyList_GET_ITEM(list, j) == o) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1300 o = class_name(o); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1301 if (o != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1302 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1303 "duplicate base class %U", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1304 o); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1305 Py_DECREF(o); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1306 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1307 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1308 "duplicate base class"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1309 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1310 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1311 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1312 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1313 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1314 return 0; |
|
26410
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1315 } |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1316 |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1317 /* Raise a TypeError for an MRO order disagreement. |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1318 |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1319 It's hard to produce a good error message. In the absence of better |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1320 insight into error reporting, report the classes that were candidates |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1321 to be put next into the MRO. There is some conflict between the |
|
26410
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1322 order in which they should be put in the MRO, but it's hard to |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1323 diagnose what constraint can't be satisfied. |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1324 */ |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1325 |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1326 static void |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1327 set_mro_error(PyObject *to_merge, int *remain) |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1328 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1329 Py_ssize_t i, n, off, to_merge_size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1330 char buf[1000]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1331 PyObject *k, *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1332 PyObject *set = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1333 if (!set) return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1334 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1335 to_merge_size = PyList_GET_SIZE(to_merge); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1336 for (i = 0; i < to_merge_size; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1337 PyObject *L = PyList_GET_ITEM(to_merge, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1338 if (remain[i] < PyList_GET_SIZE(L)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1339 PyObject *c = PyList_GET_ITEM(L, remain[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1340 if (PyDict_SetItem(set, c, Py_None) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1341 Py_DECREF(set); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1342 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1343 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1344 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1345 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1346 n = PyDict_Size(set); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1347 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1348 off = PyOS_snprintf(buf, sizeof(buf), "Cannot create a \ |
|
28514
9400504cb0b2
SF bug #699934: Obscure error message
Raymond Hettinger <python@rcn.com>
parents:
28403
diff
changeset
|
1349 consistent method resolution\norder (MRO) for bases"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1350 i = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1351 while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1352 PyObject *name = class_name(k); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1353 off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1354 name ? _PyUnicode_AsString(name) : "?"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1355 Py_XDECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1356 if (--n && (size_t)(off+1) < sizeof(buf)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1357 buf[off++] = ','; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1358 buf[off] = '\0'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1359 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1360 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1361 PyErr_SetString(PyExc_TypeError, buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1362 Py_DECREF(set); |
|
26410
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1363 } |
|
26918e2efd17
A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents:
26227
diff
changeset
|
1364 |
|
26575
93b5ca9423eb
slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents:
26559
diff
changeset
|
1365 static int |
|
26222
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1366 pmerge(PyObject *acc, PyObject* to_merge) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1367 Py_ssize_t i, j, to_merge_size, empty_cnt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1368 int *remain; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1369 int ok; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1370 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1371 to_merge_size = PyList_GET_SIZE(to_merge); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1372 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1373 /* remain stores an index into each sublist of to_merge. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1374 remain[i] is the index of the next base in to_merge[i] |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1375 that is not included in acc. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1376 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1377 remain = (int *)PyMem_MALLOC(SIZEOF_INT*to_merge_size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1378 if (remain == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1379 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1380 for (i = 0; i < to_merge_size; i++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1381 remain[i] = 0; |
|
26222
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1382 |
|
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1383 again: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1384 empty_cnt = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1385 for (i = 0; i < to_merge_size; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1386 PyObject *candidate; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1387 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1388 PyObject *cur_list = PyList_GET_ITEM(to_merge, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1389 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1390 if (remain[i] >= PyList_GET_SIZE(cur_list)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1391 empty_cnt++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1392 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1393 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1394 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1395 /* Choose next candidate for MRO. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1396 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1397 The input sequences alone can determine the choice. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1398 If not, choose the class which appears in the MRO |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1399 of the earliest direct superclass of the new class. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1400 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1401 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1402 candidate = PyList_GET_ITEM(cur_list, remain[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1403 for (j = 0; j < to_merge_size; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1404 PyObject *j_lst = PyList_GET_ITEM(to_merge, j); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1405 if (tail_contains(j_lst, remain[j], candidate)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1406 goto skip; /* continue outer loop */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1407 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1408 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1409 ok = PyList_Append(acc, candidate); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1410 if (ok < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1411 PyMem_Free(remain); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1412 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1413 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1414 for (j = 0; j < to_merge_size; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1415 PyObject *j_lst = PyList_GET_ITEM(to_merge, j); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1416 if (remain[j] < PyList_GET_SIZE(j_lst) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1417 PyList_GET_ITEM(j_lst, remain[j]) == candidate) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1418 remain[j]++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1419 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1420 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1421 goto again; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1422 skip: ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1423 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1424 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1425 if (empty_cnt == to_merge_size) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1426 PyMem_FREE(remain); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1427 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1428 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1429 set_mro_error(to_merge, remain); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1430 PyMem_FREE(remain); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1431 return -1; |
|
26222
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1432 } |
|
c95190532c0c
Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents:
25853
diff
changeset
|
1433 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1434 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1435 mro_implementation(PyTypeObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1436 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1437 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1438 int ok; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1439 PyObject *bases, *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1440 PyObject *to_merge, *bases_aslist; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1441 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1442 if (type->tp_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1443 if (PyType_Ready(type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1444 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1445 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1446 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1447 /* Find a superclass linearization that honors the constraints |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1448 of the explicit lists of bases and the constraints implied by |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1449 each base class. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1450 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1451 to_merge is a list of lists, where each list is a superclass |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1452 linearization implied by a base class. The last element of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1453 to_merge is the declared list of bases. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1454 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1455 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1456 bases = type->tp_bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1457 n = PyTuple_GET_SIZE(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1458 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1459 to_merge = PyList_New(n+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1460 if (to_merge == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1461 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1462 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1463 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1464 PyObject *base = PyTuple_GET_ITEM(bases, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1465 PyObject *parentMRO; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1466 parentMRO = PySequence_List(((PyTypeObject*)base)->tp_mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1467 if (parentMRO == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1468 Py_DECREF(to_merge); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1469 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1470 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1471 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1472 PyList_SET_ITEM(to_merge, i, parentMRO); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1473 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1474 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1475 bases_aslist = PySequence_List(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1476 if (bases_aslist == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1477 Py_DECREF(to_merge); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1478 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1479 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1480 /* This is just a basic sanity check. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1481 if (check_duplicates(bases_aslist) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1482 Py_DECREF(to_merge); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1483 Py_DECREF(bases_aslist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1484 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1485 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1486 PyList_SET_ITEM(to_merge, n, bases_aslist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1487 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1488 result = Py_BuildValue("[O]", (PyObject *)type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1489 if (result == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1490 Py_DECREF(to_merge); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1491 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1492 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1493 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1494 ok = pmerge(result, to_merge); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1495 Py_DECREF(to_merge); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1496 if (ok < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1497 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1498 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1499 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1500 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1501 return result; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1502 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1503 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1504 static PyObject * |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19300
diff
changeset
|
1505 mro_external(PyObject *self) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1506 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1507 PyTypeObject *type = (PyTypeObject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1508 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1509 return mro_implementation(type); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1510 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1511 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1512 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1513 mro_internal(PyTypeObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1514 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1515 PyObject *mro, *result, *tuple; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1516 int checkit = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1517 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1518 if (Py_TYPE(type) == &PyType_Type) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1519 result = mro_implementation(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1520 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1521 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1522 static PyObject *mro_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1523 checkit = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1524 mro = lookup_method((PyObject *)type, "mro", &mro_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1525 if (mro == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1526 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1527 result = PyObject_CallObject(mro, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1528 Py_DECREF(mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1529 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1530 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1531 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1532 tuple = PySequence_Tuple(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1533 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1534 if (tuple == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1535 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1536 if (checkit) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1537 Py_ssize_t i, len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1538 PyObject *cls; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1539 PyTypeObject *solid; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1540 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1541 solid = solid_base(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1542 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1543 len = PyTuple_GET_SIZE(tuple); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1544 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1545 for (i = 0; i < len; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1546 PyTypeObject *t; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1547 cls = PyTuple_GET_ITEM(tuple, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1548 if (!PyType_Check(cls)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1549 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1550 "mro() returned a non-class ('%.500s')", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1551 Py_TYPE(cls)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1552 Py_DECREF(tuple); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1553 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1554 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1555 t = (PyTypeObject*)cls; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1556 if (!PyType_IsSubtype(solid, solid_base(t))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1557 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1558 "mro() returned base with unsuitable layout ('%.500s')", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1559 t->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1560 Py_DECREF(tuple); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1561 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1562 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1563 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1564 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1565 type->tp_mro = tuple; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1566 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1567 type_mro_modified(type, type->tp_mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1568 /* corner case: the old-style super class might have been hidden |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1569 from the custom MRO */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1570 type_mro_modified(type, type->tp_bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1571 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1572 PyType_Modified(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1573 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1574 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1575 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1576 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1577 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1578 /* Calculate the best base amongst multiple base classes. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1579 This is the first one that's on the path to the "solid base". */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1580 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1581 static PyTypeObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1582 best_base(PyObject *bases) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1583 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1584 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1585 PyTypeObject *base, *winner, *candidate, *base_i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1586 PyObject *base_proto; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1587 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1588 assert(PyTuple_Check(bases)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1589 n = PyTuple_GET_SIZE(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1590 assert(n > 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1591 base = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1592 winner = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1593 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1594 base_proto = PyTuple_GET_ITEM(bases, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1595 if (!PyType_Check(base_proto)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1596 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1597 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1598 "bases must be types"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1599 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1600 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1601 base_i = (PyTypeObject *)base_proto; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1602 if (base_i->tp_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1603 if (PyType_Ready(base_i) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1604 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1605 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1606 candidate = solid_base(base_i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1607 if (winner == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1608 winner = candidate; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1609 base = base_i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1610 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1611 else if (PyType_IsSubtype(winner, candidate)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1612 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1613 else if (PyType_IsSubtype(candidate, winner)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1614 winner = candidate; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1615 base = base_i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1616 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1617 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1618 PyErr_SetString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1619 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1620 "multiple bases have " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1621 "instance lay-out conflict"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1622 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1623 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1624 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1625 if (base == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1626 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1627 "a new-style class can't have only classic bases"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1628 return base; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1629 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1630 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1631 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1632 extra_ivars(PyTypeObject *type, PyTypeObject *base) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1633 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1634 size_t t_size = type->tp_basicsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1635 size_t b_size = base->tp_basicsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1636 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1637 assert(t_size >= b_size); /* Else type smaller than base! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1638 if (type->tp_itemsize || base->tp_itemsize) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1639 /* If itemsize is involved, stricter rules */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1640 return t_size != b_size || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1641 type->tp_itemsize != base->tp_itemsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1642 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1643 if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1644 type->tp_weaklistoffset + sizeof(PyObject *) == t_size && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1645 type->tp_flags & Py_TPFLAGS_HEAPTYPE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1646 t_size -= sizeof(PyObject *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1647 if (type->tp_dictoffset && base->tp_dictoffset == 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1648 type->tp_dictoffset + sizeof(PyObject *) == t_size && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1649 type->tp_flags & Py_TPFLAGS_HEAPTYPE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1650 t_size -= sizeof(PyObject *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1651 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1652 return t_size != b_size; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1653 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1654 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1655 static PyTypeObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1656 solid_base(PyTypeObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1657 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1658 PyTypeObject *base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1659 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1660 if (type->tp_base) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1661 base = solid_base(type->tp_base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1662 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1663 base = &PyBaseObject_Type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1664 if (extra_ivars(type, base)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1665 return type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1666 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1667 return base; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1668 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1669 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24250
diff
changeset
|
1670 static void object_dealloc(PyObject *); |
|
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24250
diff
changeset
|
1671 static int object_init(PyObject *, PyObject *, PyObject *); |
|
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24250
diff
changeset
|
1672 static int update_slot(PyTypeObject *, PyObject *); |
|
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24250
diff
changeset
|
1673 static void fixup_slot_dispatchers(PyTypeObject *); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1674 |
|
41716
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1675 /* |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1676 * Helpers for __dict__ descriptor. We don't want to expose the dicts |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1677 * inherited from various builtin types. The builtin base usually provides |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1678 * its own __dict__ descriptor, so we use that when we can. |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1679 */ |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1680 static PyTypeObject * |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1681 get_builtin_base_with_dict(PyTypeObject *type) |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1682 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1683 while (type->tp_base != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1684 if (type->tp_dictoffset != 0 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1685 !(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1686 return type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1687 type = type->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1688 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1689 return NULL; |
|
41716
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1690 } |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1691 |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1692 static PyObject * |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1693 get_dict_descriptor(PyTypeObject *type) |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1694 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1695 static PyObject *dict_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1696 PyObject *descr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1697 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1698 if (dict_str == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1699 dict_str = PyUnicode_InternFromString("__dict__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1700 if (dict_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1701 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1702 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1703 descr = _PyType_Lookup(type, dict_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1704 if (descr == NULL || !PyDescr_IsData(descr)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1705 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1706 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1707 return descr; |
|
41716
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1708 } |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1709 |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1710 static void |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1711 raise_dict_descr_error(PyObject *obj) |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1712 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1713 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1714 "this __dict__ descriptor does not support " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1715 "'%.200s' objects", Py_TYPE(obj)->tp_name); |
|
41716
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1716 } |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41587
diff
changeset
|
1717 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1718 static PyObject * |
|
19616
337b53679c73
Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents:
19595
diff
changeset
|
1719 subtype_dict(PyObject *obj, void *context) |
|
337b53679c73
Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents:
19595
diff
changeset
|
1720 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1721 PyObject **dictptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1722 PyObject *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1723 PyTypeObject *base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1724 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1725 base = get_builtin_base_with_dict(Py_TYPE(obj)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1726 if (base != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1727 descrgetfunc func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1728 PyObject *descr = get_dict_descriptor(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1729 if (descr == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1730 raise_dict_descr_error(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1731 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1732 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1733 func = Py_TYPE(descr)->tp_descr_get; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1734 if (func == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1735 raise_dict_descr_error(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1736 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1737 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1738 return func(descr, obj, (PyObject *)(Py_TYPE(obj))); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1739 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1740 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1741 dictptr = _PyObject_GetDictPtr(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1742 if (dictptr == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1743 PyErr_SetString(PyExc_AttributeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1744 "This object has no __dict__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1745 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1746 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1747 dict = *dictptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1748 if (dict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1749 *dictptr = dict = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1750 Py_XINCREF(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1751 return dict; |
|
19616
337b53679c73
Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents:
19595
diff
changeset
|
1752 } |
|
337b53679c73
Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents:
19595
diff
changeset
|
1753 |
|
20681
a0f1c2d2ac9e
Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents:
20599
diff
changeset
|
1754 static int |
|
a0f1c2d2ac9e
Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents:
20599
diff
changeset
|
1755 subtype_setdict(PyObject *obj, PyObject *value, void *context) |
|
a0f1c2d2ac9e
Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents:
20599
diff
changeset
|
1756 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1757 PyObject **dictptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1758 PyObject *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1759 PyTypeObject *base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1760 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1761 base = get_builtin_base_with_dict(Py_TYPE(obj)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1762 if (base != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1763 descrsetfunc func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1764 PyObject *descr = get_dict_descriptor(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1765 if (descr == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1766 raise_dict_descr_error(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1767 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1768 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1769 func = Py_TYPE(descr)->tp_descr_set; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1770 if (func == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1771 raise_dict_descr_error(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1772 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1773 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1774 return func(descr, obj, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1775 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1776 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1777 dictptr = _PyObject_GetDictPtr(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1778 if (dictptr == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1779 PyErr_SetString(PyExc_AttributeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1780 "This object has no __dict__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1781 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1782 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1783 if (value != NULL && !PyDict_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1784 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1785 "__dict__ must be set to a dictionary, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1786 "not a '%.200s'", Py_TYPE(value)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1787 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1788 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1789 dict = *dictptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1790 Py_XINCREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1791 *dictptr = value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1792 Py_XDECREF(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1793 return 0; |
|
20681
a0f1c2d2ac9e
Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents:
20599
diff
changeset
|
1794 } |
|
a0f1c2d2ac9e
Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents:
20599
diff
changeset
|
1795 |
|
24761
e0431d9c4474
Refactor how __dict__ and __weakref__ interact with __slots__.
Guido van Rossum <guido@python.org>
parents:
24728
diff
changeset
|
1796 static PyObject * |
|
e0431d9c4474
Refactor how __dict__ and __weakref__ interact with __slots__.
Guido van Rossum <guido@python.org>
parents:
24728
diff
changeset
|
1797 subtype_getweakref(PyObject *obj, void *context) |
|
e0431d9c4474
Refactor how __dict__ and __weakref__ interact with __slots__.
Guido van Rossum <guido@python.org>
parents:
24728
diff
changeset
|
1798 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1799 PyObject **weaklistptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1800 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1801 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1802 if (Py_TYPE(obj)->tp_weaklistoffset == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1803 PyErr_SetString(PyExc_AttributeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1804 "This object has no __weakref__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1805 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1806 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1807 assert(Py_TYPE(obj)->tp_weaklistoffset > 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1808 assert(Py_TYPE(obj)->tp_weaklistoffset + sizeof(PyObject *) <= |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1809 (size_t)(Py_TYPE(obj)->tp_basicsize)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1810 weaklistptr = (PyObject **) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1811 ((char *)obj + Py_TYPE(obj)->tp_weaklistoffset); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1812 if (*weaklistptr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1813 result = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1814 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1815 result = *weaklistptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1816 Py_INCREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1817 return result; |
|
24761
e0431d9c4474
Refactor how __dict__ and __weakref__ interact with __slots__.
Guido van Rossum <guido@python.org>
parents:
24728
diff
changeset
|
1818 } |
|
e0431d9c4474
Refactor how __dict__ and __weakref__ interact with __slots__.
Guido van Rossum <guido@python.org>
parents:
24728
diff
changeset
|
1819 |
|
27132
22d660494f29
Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents:
27124
diff
changeset
|
1820 /* Three variants on the subtype_getsets list. */ |
|
22d660494f29
Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents:
27124
diff
changeset
|
1821 |
|
22d660494f29
Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents:
27124
diff
changeset
|
1822 static PyGetSetDef subtype_getsets_full[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1823 {"__dict__", subtype_dict, subtype_setdict, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1824 PyDoc_STR("dictionary for instance variables (if defined)")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1825 {"__weakref__", subtype_getweakref, NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1826 PyDoc_STR("list of weak references to the object (if defined)")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1827 {0} |
|
19616
337b53679c73
Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents:
19595
diff
changeset
|
1828 }; |
|
337b53679c73
Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents:
19595
diff
changeset
|
1829 |
|
27132
22d660494f29
Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents:
27124
diff
changeset
|
1830 static PyGetSetDef subtype_getsets_dict_only[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1831 {"__dict__", subtype_dict, subtype_setdict, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1832 PyDoc_STR("dictionary for instance variables (if defined)")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1833 {0} |
|
27132
22d660494f29
Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents:
27124
diff
changeset
|
1834 }; |
|
22d660494f29
Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents:
27124
diff
changeset
|
1835 |
|
22d660494f29
Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents:
27124
diff
changeset
|
1836 static PyGetSetDef subtype_getsets_weakref_only[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1837 {"__weakref__", subtype_getweakref, NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1838 PyDoc_STR("list of weak references to the object (if defined)")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1839 {0} |
|
27132
22d660494f29
Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents:
27124
diff
changeset
|
1840 }; |
|
22d660494f29
Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents:
27124
diff
changeset
|
1841 |
|
23666
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
1842 static int |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
1843 valid_identifier(PyObject *s) |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
1844 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1845 if (!PyUnicode_Check(s)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1846 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1847 "__slots__ items must be strings, not '%.200s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1848 Py_TYPE(s)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1849 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1850 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1851 if (!PyUnicode_IsIdentifier(s)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1852 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1853 "__slots__ must be identifiers"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1854 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1855 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1856 return 1; |
|
23666
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
1857 } |
|
2becb5793acd
Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents:
23649
diff
changeset
|
1858 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
1859 /* Forward */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
1860 static int |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
1861 object_init(PyObject *self, PyObject *args, PyObject *kwds); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
1862 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
1863 static int |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
1864 type_init(PyObject *cls, PyObject *args, PyObject *kwds) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
1865 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1866 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1867 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1868 assert(args != NULL && PyTuple_Check(args)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1869 assert(kwds == NULL || PyDict_Check(kwds)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1870 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1871 if (kwds != NULL && PyDict_Check(kwds) && PyDict_Size(kwds) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1872 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1873 "type.__init__() takes no keyword arguments"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1874 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1875 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1876 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1877 if (args != NULL && PyTuple_Check(args) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1878 (PyTuple_GET_SIZE(args) != 1 && PyTuple_GET_SIZE(args) != 3)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1879 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1880 "type.__init__() takes 1 or 3 arguments"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1881 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1882 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1883 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1884 /* Call object.__init__(self) now. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1885 /* XXX Could call super(type, cls).__init__() but what's the point? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1886 args = PyTuple_GetSlice(args, 0, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1887 res = object_init(cls, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1888 Py_DECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1889 return res; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
1890 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
1891 |
|
19616
337b53679c73
Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents:
19595
diff
changeset
|
1892 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1893 type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
1894 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1895 PyObject *name, *bases, *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1896 static char *kwlist[] = {"name", "bases", "dict", 0}; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1897 PyObject *slots, *tmp, *newslots; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1898 PyTypeObject *type, *base, *tmptype, *winner; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1899 PyHeapTypeObject *et; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1900 PyMemberDef *mp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1901 Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1902 int j, may_add_dict, may_add_weak; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1903 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1904 assert(args != NULL && PyTuple_Check(args)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1905 assert(kwds == NULL || PyDict_Check(kwds)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1906 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1907 /* Special case: type(x) should return x->ob_type */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1908 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1909 const Py_ssize_t nargs = PyTuple_GET_SIZE(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1910 const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1911 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1912 if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1913 PyObject *x = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1914 Py_INCREF(Py_TYPE(x)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1915 return (PyObject *) Py_TYPE(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1916 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1917 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1918 /* SF bug 475327 -- if that didn't trigger, we need 3 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1919 arguments. but PyArg_ParseTupleAndKeywords below may give |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1920 a msg saying type() needs exactly 3. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1921 if (nargs + nkwds != 3) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1922 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1923 "type() takes 1 or 3 arguments"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1924 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1925 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1926 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1927 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1928 /* Check arguments: (name, bases, dict) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1929 if (!PyArg_ParseTupleAndKeywords(args, kwds, "UO!O!:type", kwlist, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1930 &name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1931 &PyTuple_Type, &bases, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1932 &PyDict_Type, &dict)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1933 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1934 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1935 /* Determine the proper metatype to deal with this, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1936 and check for metatype conflicts while we're at it. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1937 Note that if some other metatype wins to contract, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1938 it's possible that its instances are not types. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1939 nbases = PyTuple_GET_SIZE(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1940 winner = metatype; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1941 for (i = 0; i < nbases; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1942 tmp = PyTuple_GET_ITEM(bases, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1943 tmptype = Py_TYPE(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1944 if (PyType_IsSubtype(winner, tmptype)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1945 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1946 if (PyType_IsSubtype(tmptype, winner)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1947 winner = tmptype; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1948 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1949 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1950 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1951 "metaclass conflict: " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1952 "the metaclass of a derived class " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1953 "must be a (non-strict) subclass " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1954 "of the metaclasses of all its bases"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1955 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1956 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1957 if (winner != metatype) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1958 if (winner->tp_new != type_new) /* Pass it to the winner */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1959 return winner->tp_new(winner, args, kwds); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1960 metatype = winner; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1961 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1962 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1963 /* Adjust for empty tuple bases */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1964 if (nbases == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1965 bases = PyTuple_Pack(1, &PyBaseObject_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1966 if (bases == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1967 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1968 nbases = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1969 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1970 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1971 Py_INCREF(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1972 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1973 /* XXX From here until type is allocated, "return NULL" leaks bases! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1974 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1975 /* Calculate best base, and check that all bases are type objects */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1976 base = best_base(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1977 if (base == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1978 Py_DECREF(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1979 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1980 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1981 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1982 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1983 "type '%.100s' is not an acceptable base type", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1984 base->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1985 Py_DECREF(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1986 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1987 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1988 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1989 /* Check for a __slots__ sequence variable in dict, and count it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1990 slots = PyDict_GetItemString(dict, "__slots__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1991 nslots = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1992 add_dict = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1993 add_weak = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1994 may_add_dict = base->tp_dictoffset == 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1995 may_add_weak = base->tp_weaklistoffset == 0 && base->tp_itemsize == 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1996 if (slots == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1997 if (may_add_dict) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1998 add_dict++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
1999 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2000 if (may_add_weak) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2001 add_weak++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2002 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2003 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2004 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2005 /* Have slots */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2006 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2007 /* Make it into a tuple */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2008 if (PyUnicode_Check(slots)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2009 slots = PyTuple_Pack(1, slots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2010 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2011 slots = PySequence_Tuple(slots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2012 if (slots == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2013 Py_DECREF(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2014 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2015 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2016 assert(PyTuple_Check(slots)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2017 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2018 /* Are slots allowed? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2019 nslots = PyTuple_GET_SIZE(slots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2020 if (nslots > 0 && base->tp_itemsize != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2021 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2022 "nonempty __slots__ " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2023 "not supported for subtype of '%s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2024 base->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2025 bad_slots: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2026 Py_DECREF(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2027 Py_DECREF(slots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2028 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2029 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2030 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2031 /* Check for valid slot names and two special cases */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2032 for (i = 0; i < nslots; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2033 PyObject *tmp = PyTuple_GET_ITEM(slots, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2034 if (!valid_identifier(tmp)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2035 goto bad_slots; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2036 assert(PyUnicode_Check(tmp)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2037 if (PyUnicode_CompareWithASCIIString(tmp, "__dict__") == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2038 if (!may_add_dict || add_dict) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2039 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2040 "__dict__ slot disallowed: " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2041 "we already got one"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2042 goto bad_slots; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2043 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2044 add_dict++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2045 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2046 if (PyUnicode_CompareWithASCIIString(tmp, "__weakref__") == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2047 if (!may_add_weak || add_weak) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2048 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2049 "__weakref__ slot disallowed: " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2050 "either we already got one, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2051 "or __itemsize__ != 0"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2052 goto bad_slots; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2053 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2054 add_weak++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2055 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2056 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2057 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2058 /* Copy slots into a list, mangle names and sort them. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2059 Sorted names are needed for __class__ assignment. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2060 Convert them back to tuple at the end. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2061 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2062 newslots = PyList_New(nslots - add_dict - add_weak); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2063 if (newslots == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2064 goto bad_slots; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2065 for (i = j = 0; i < nslots; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2066 tmp = PyTuple_GET_ITEM(slots, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2067 if ((add_dict && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2068 PyUnicode_CompareWithASCIIString(tmp, "__dict__") == 0) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2069 (add_weak && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2070 PyUnicode_CompareWithASCIIString(tmp, "__weakref__") == 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2071 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2072 tmp =_Py_Mangle(name, tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2073 if (!tmp) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2074 goto bad_slots; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2075 PyList_SET_ITEM(newslots, j, tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2076 j++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2077 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2078 assert(j == nslots - add_dict - add_weak); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2079 nslots = j; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2080 Py_DECREF(slots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2081 if (PyList_Sort(newslots) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2082 Py_DECREF(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2083 Py_DECREF(newslots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2084 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2085 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2086 slots = PyList_AsTuple(newslots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2087 Py_DECREF(newslots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2088 if (slots == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2089 Py_DECREF(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2090 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2091 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2092 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2093 /* Secondary bases may provide weakrefs or dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2094 if (nbases > 1 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2095 ((may_add_dict && !add_dict) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2096 (may_add_weak && !add_weak))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2097 for (i = 0; i < nbases; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2098 tmp = PyTuple_GET_ITEM(bases, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2099 if (tmp == (PyObject *)base) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2100 continue; /* Skip primary base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2101 assert(PyType_Check(tmp)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2102 tmptype = (PyTypeObject *)tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2103 if (may_add_dict && !add_dict && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2104 tmptype->tp_dictoffset != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2105 add_dict++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2106 if (may_add_weak && !add_weak && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2107 tmptype->tp_weaklistoffset != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2108 add_weak++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2109 if (may_add_dict && !add_dict) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2110 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2111 if (may_add_weak && !add_weak) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2112 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2113 /* Nothing more to check */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2114 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2115 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2116 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2117 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2118 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2119 /* XXX From here until type is safely allocated, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2120 "return NULL" may leak slots! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2121 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2122 /* Allocate the type object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2123 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2124 if (type == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2125 Py_XDECREF(slots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2126 Py_DECREF(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2127 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2128 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2129 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2130 /* Keep name and slots alive in the extended type object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2131 et = (PyHeapTypeObject *)type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2132 Py_INCREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2133 et->ht_name = name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2134 et->ht_slots = slots; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2135 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2136 /* Initialize tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2137 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE | |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2138 Py_TPFLAGS_BASETYPE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2139 if (base->tp_flags & Py_TPFLAGS_HAVE_GC) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2140 type->tp_flags |= Py_TPFLAGS_HAVE_GC; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2141 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2142 /* Initialize essential fields */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2143 type->tp_as_number = &et->as_number; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2144 type->tp_as_sequence = &et->as_sequence; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2145 type->tp_as_mapping = &et->as_mapping; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2146 type->tp_as_buffer = &et->as_buffer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2147 type->tp_name = _PyUnicode_AsString(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2148 if (!type->tp_name) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2149 Py_DECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2150 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2151 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2152 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2153 /* Set tp_base and tp_bases */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2154 type->tp_bases = bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2155 Py_INCREF(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2156 type->tp_base = base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2157 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2158 /* Initialize tp_dict from passed-in dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2159 type->tp_dict = dict = PyDict_Copy(dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2160 if (dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2161 Py_DECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2162 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2163 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2164 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2165 /* Set __module__ in the dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2166 if (PyDict_GetItemString(dict, "__module__") == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2167 tmp = PyEval_GetGlobals(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2168 if (tmp != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2169 tmp = PyDict_GetItemString(tmp, "__name__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2170 if (tmp != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2171 if (PyDict_SetItemString(dict, "__module__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2172 tmp) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2173 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2174 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2175 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2176 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2177 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2178 /* Set tp_doc to a copy of dict['__doc__'], if the latter is there |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2179 and is a string. The __doc__ accessor will first look for tp_doc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2180 if that fails, it will still look into __dict__. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2181 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2182 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2183 PyObject *doc = PyDict_GetItemString(dict, "__doc__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2184 if (doc != NULL && PyUnicode_Check(doc)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2185 Py_ssize_t len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2186 char *doc_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2187 char *tp_doc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2188 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2189 doc_str = _PyUnicode_AsString(doc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2190 if (doc_str == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2191 Py_DECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2192 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2193 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2194 /* Silently truncate the docstring if it contains null bytes. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2195 len = strlen(doc_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2196 tp_doc = (char *)PyObject_MALLOC(len + 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2197 if (tp_doc == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2198 Py_DECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2199 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2200 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2201 memcpy(tp_doc, doc_str, len + 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2202 type->tp_doc = tp_doc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2203 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2204 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2205 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2206 /* Special-case __new__: if it's a plain function, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2207 make it a static function */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2208 tmp = PyDict_GetItemString(dict, "__new__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2209 if (tmp != NULL && PyFunction_Check(tmp)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2210 tmp = PyStaticMethod_New(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2211 if (tmp == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2212 Py_DECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2213 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2214 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2215 PyDict_SetItemString(dict, "__new__", tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2216 Py_DECREF(tmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2217 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2218 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2219 /* Add descriptors for custom slots from __slots__, or for __dict__ */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2220 mp = PyHeapType_GET_MEMBERS(et); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2221 slotoffset = base->tp_basicsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2222 if (slots != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2223 for (i = 0; i < nslots; i++, mp++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2224 mp->name = _PyUnicode_AsString( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2225 PyTuple_GET_ITEM(slots, i)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2226 mp->type = T_OBJECT_EX; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2227 mp->offset = slotoffset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2228 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2229 /* __dict__ and __weakref__ are already filtered out */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2230 assert(strcmp(mp->name, "__dict__") != 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2231 assert(strcmp(mp->name, "__weakref__") != 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2232 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2233 slotoffset += sizeof(PyObject *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2234 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2235 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2236 if (add_dict) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2237 if (base->tp_itemsize) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2238 type->tp_dictoffset = -(long)sizeof(PyObject *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2239 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2240 type->tp_dictoffset = slotoffset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2241 slotoffset += sizeof(PyObject *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2242 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2243 if (add_weak) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2244 assert(!base->tp_itemsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2245 type->tp_weaklistoffset = slotoffset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2246 slotoffset += sizeof(PyObject *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2247 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2248 type->tp_basicsize = slotoffset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2249 type->tp_itemsize = base->tp_itemsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2250 type->tp_members = PyHeapType_GET_MEMBERS(et); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2251 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2252 if (type->tp_weaklistoffset && type->tp_dictoffset) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2253 type->tp_getset = subtype_getsets_full; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2254 else if (type->tp_weaklistoffset && !type->tp_dictoffset) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2255 type->tp_getset = subtype_getsets_weakref_only; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2256 else if (!type->tp_weaklistoffset && type->tp_dictoffset) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2257 type->tp_getset = subtype_getsets_dict_only; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2258 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2259 type->tp_getset = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2260 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2261 /* Special case some slots */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2262 if (type->tp_dictoffset != 0 || nslots > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2263 if (base->tp_getattr == NULL && base->tp_getattro == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2264 type->tp_getattro = PyObject_GenericGetAttr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2265 if (base->tp_setattr == NULL && base->tp_setattro == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2266 type->tp_setattro = PyObject_GenericSetAttr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2267 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2268 type->tp_dealloc = subtype_dealloc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2269 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2270 /* Enable GC unless there are really no instance variables possible */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2271 if (!(type->tp_basicsize == sizeof(PyObject) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2272 type->tp_itemsize == 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2273 type->tp_flags |= Py_TPFLAGS_HAVE_GC; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2274 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2275 /* Always override allocation strategy to use regular heap */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2276 type->tp_alloc = PyType_GenericAlloc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2277 if (type->tp_flags & Py_TPFLAGS_HAVE_GC) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2278 type->tp_free = PyObject_GC_Del; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2279 type->tp_traverse = subtype_traverse; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2280 type->tp_clear = subtype_clear; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2281 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2282 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2283 type->tp_free = PyObject_Del; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2284 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2285 /* Initialize the rest */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2286 if (PyType_Ready(type) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2287 Py_DECREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2288 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2289 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2290 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2291 /* Put the proper slots in place */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2292 fixup_slot_dispatchers(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2293 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2294 return (PyObject *)type; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2295 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2296 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2297 /* Internal API to look for a name through the MRO. |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2298 This returns a borrowed reference, and doesn't set an exception! */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2299 PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2300 _PyType_Lookup(PyTypeObject *type, PyObject *name) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2301 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2302 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2303 PyObject *mro, *res, *base, *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2304 unsigned int h; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2305 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2306 if (MCACHE_CACHEABLE_NAME(name) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2307 PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2308 /* fast path */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2309 h = MCACHE_HASH_METHOD(type, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2310 if (method_cache[h].version == type->tp_version_tag && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2311 method_cache[h].name == name) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2312 return method_cache[h].value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2313 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2314 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2315 /* Look in tp_dict of types in MRO */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2316 mro = type->tp_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2317 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2318 /* If mro is NULL, the type is either not yet initialized |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2319 by PyType_Ready(), or already cleared by type_clear(). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2320 Either way the safest thing to do is to return NULL. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2321 if (mro == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2322 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2323 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2324 res = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2325 assert(PyTuple_Check(mro)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2326 n = PyTuple_GET_SIZE(mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2327 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2328 base = PyTuple_GET_ITEM(mro, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2329 assert(PyType_Check(base)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2330 dict = ((PyTypeObject *)base)->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2331 assert(dict && PyDict_Check(dict)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2332 res = PyDict_GetItem(dict, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2333 if (res != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2334 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2335 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2336 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2337 if (MCACHE_CACHEABLE_NAME(name) && assign_version_tag(type)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2338 h = MCACHE_HASH_METHOD(type, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2339 method_cache[h].version = type->tp_version_tag; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2340 method_cache[h].value = res; /* borrowed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2341 Py_INCREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2342 Py_DECREF(method_cache[h].name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2343 method_cache[h].name = name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2344 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2345 return res; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2346 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2347 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2348 /* This is similar to PyObject_GenericGetAttr(), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2349 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2350 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2351 type_getattro(PyTypeObject *type, PyObject *name) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2352 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2353 PyTypeObject *metatype = Py_TYPE(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2354 PyObject *meta_attribute, *attribute; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2355 descrgetfunc meta_get; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2356 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2357 /* Initialize this type (we'll assume the metatype is initialized) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2358 if (type->tp_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2359 if (PyType_Ready(type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2360 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2361 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2362 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2363 /* No readable descriptor found yet */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2364 meta_get = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2365 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2366 /* Look for the attribute in the metatype */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2367 meta_attribute = _PyType_Lookup(metatype, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2368 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2369 if (meta_attribute != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2370 meta_get = Py_TYPE(meta_attribute)->tp_descr_get; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2371 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2372 if (meta_get != NULL && PyDescr_IsData(meta_attribute)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2373 /* Data descriptors implement tp_descr_set to intercept |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2374 * writes. Assume the attribute is not overridden in |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2375 * type's tp_dict (and bases): call the descriptor now. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2376 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2377 return meta_get(meta_attribute, (PyObject *)type, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2378 (PyObject *)metatype); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2379 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2380 Py_INCREF(meta_attribute); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2381 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2382 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2383 /* No data descriptor found on metatype. Look in tp_dict of this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2384 * type and its bases */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2385 attribute = _PyType_Lookup(type, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2386 if (attribute != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2387 /* Implement descriptor functionality, if any */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2388 descrgetfunc local_get = Py_TYPE(attribute)->tp_descr_get; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2389 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2390 Py_XDECREF(meta_attribute); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2391 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2392 if (local_get != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2393 /* NULL 2nd argument indicates the descriptor was |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2394 * found on the target object itself (or a base) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2395 return local_get(attribute, (PyObject *)NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2396 (PyObject *)type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2397 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2398 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2399 Py_INCREF(attribute); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2400 return attribute; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2401 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2402 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2403 /* No attribute found in local __dict__ (or bases): use the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2404 * descriptor from the metatype, if any */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2405 if (meta_get != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2406 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2407 res = meta_get(meta_attribute, (PyObject *)type, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2408 (PyObject *)metatype); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2409 Py_DECREF(meta_attribute); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2410 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2411 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2412 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2413 /* If an ordinary attribute was found on the metatype, return it now */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2414 if (meta_attribute != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2415 return meta_attribute; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2416 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2417 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2418 /* Give up */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2419 PyErr_Format(PyExc_AttributeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2420 "type object '%.50s' has no attribute '%U'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2421 type->tp_name, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2422 return NULL; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2423 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2424 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2425 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2426 type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2427 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2428 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2429 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2430 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2431 "can't set attributes of built-in/extension type '%s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2432 type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2433 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2434 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2435 if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2436 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2437 return update_slot(type, name); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2438 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2439 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2440 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2441 type_dealloc(PyTypeObject *type) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2442 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2443 PyHeapTypeObject *et; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2444 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2445 /* Assert this is a heap-allocated type object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2446 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2447 _PyObject_GC_UNTRACK(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2448 PyObject_ClearWeakRefs((PyObject *)type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2449 et = (PyHeapTypeObject *)type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2450 Py_XDECREF(type->tp_base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2451 Py_XDECREF(type->tp_dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2452 Py_XDECREF(type->tp_bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2453 Py_XDECREF(type->tp_mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2454 Py_XDECREF(type->tp_cache); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2455 Py_XDECREF(type->tp_subclasses); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2456 /* A type's tp_doc is heap allocated, unlike the tp_doc slots |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2457 * of most other objects. It's okay to cast it to char *. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2458 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2459 PyObject_Free((char *)type->tp_doc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2460 Py_XDECREF(et->ht_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2461 Py_XDECREF(et->ht_slots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2462 Py_TYPE(type)->tp_free((PyObject *)type); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2463 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2464 |
|
20315
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
2465 static PyObject * |
|
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
2466 type_subclasses(PyTypeObject *type, PyObject *args_ignored) |
|
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
2467 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2468 PyObject *list, *raw, *ref; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2469 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2470 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2471 list = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2472 if (list == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2473 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2474 raw = type->tp_subclasses; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2475 if (raw == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2476 return list; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2477 assert(PyList_Check(raw)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2478 n = PyList_GET_SIZE(raw); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2479 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2480 ref = PyList_GET_ITEM(raw, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2481 assert(PyWeakref_CheckRef(ref)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2482 ref = PyWeakref_GET_OBJECT(ref); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2483 if (ref != Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2484 if (PyList_Append(list, ref) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2485 Py_DECREF(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2486 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2487 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2488 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2489 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2490 return list; |
|
20315
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
2491 } |
|
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
2492 |
|
42420
02c27177df79
Add a default __prepare__() method to 'type', so it can be called
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
2493 static PyObject * |
|
02c27177df79
Add a default __prepare__() method to 'type', so it can be called
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
2494 type_prepare(PyObject *self, PyObject *args, PyObject *kwds) |
|
02c27177df79
Add a default __prepare__() method to 'type', so it can be called
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
2495 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2496 return PyDict_New(); |
|
42420
02c27177df79
Add a default __prepare__() method to 'type', so it can be called
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
2497 } |
|
02c27177df79
Add a default __prepare__() method to 'type', so it can be called
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
2498 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2499 static PyMethodDef type_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2500 {"mro", (PyCFunction)mro_external, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2501 PyDoc_STR("mro() -> list\nreturn a type's method resolution order")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2502 {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2503 PyDoc_STR("__subclasses__() -> list of immediate subclasses")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2504 {"__prepare__", (PyCFunction)type_prepare, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2505 METH_VARARGS | METH_KEYWORDS | METH_CLASS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2506 PyDoc_STR("__prepare__() -> dict\n" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2507 "used to create the namespace for the class statement")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2508 {"__instancecheck__", type___instancecheck__, METH_O, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2509 PyDoc_STR("__instancecheck__() -> check if an object is an instance")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2510 {"__subclasscheck__", type___subclasscheck__, METH_O, |
|
64077
4085cc560e9e
Merged revisions 84106 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
61467
diff
changeset
|
2511 PyDoc_STR("__subclasscheck__() -> check if a class is a subclass")}, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2512 {0} |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2513 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2514 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23830
diff
changeset
|
2515 PyDoc_STRVAR(type_doc, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2516 "type(object) -> the object's type\n" |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23830
diff
changeset
|
2517 "type(name, bases, dict) -> a new type"); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2518 |
|
20220
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2519 static int |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2520 type_traverse(PyTypeObject *type, visitproc visit, void *arg) |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2521 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2522 /* Because of type_is_gc(), the collector only calls this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2523 for heaptypes. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2524 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2525 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2526 Py_VISIT(type->tp_dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2527 Py_VISIT(type->tp_cache); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2528 Py_VISIT(type->tp_mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2529 Py_VISIT(type->tp_bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2530 Py_VISIT(type->tp_base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2531 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2532 /* There's no need to visit type->tp_subclasses or |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2533 ((PyHeapTypeObject *)type)->ht_slots, because they can't be involved |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2534 in cycles; tp_subclasses is a list of weak references, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2535 and slots is a tuple of strings. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2536 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2537 return 0; |
|
20220
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2538 } |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2539 |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2540 static int |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2541 type_clear(PyTypeObject *type) |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2542 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2543 /* Because of type_is_gc(), the collector only calls this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2544 for heaptypes. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2545 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2546 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2547 /* The only field we need to clear is tp_mro, which is part of a |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2548 hard cycle (its first element is the class itself) that won't |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2549 be broken otherwise (it's a tuple and tuples don't have a |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2550 tp_clear handler). None of the other fields need to be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2551 cleared, and here's why: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2552 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2553 tp_dict: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2554 It is a dict, so the collector will call its tp_clear. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2555 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2556 tp_cache: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2557 Not used; if it were, it would be a dict. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2558 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2559 tp_bases, tp_base: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2560 If these are involved in a cycle, there must be at least |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2561 one other, mutable object in the cycle, e.g. a base |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2562 class's dict; the cycle will be broken that way. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2563 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2564 tp_subclasses: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2565 A list of weak references can't be part of a cycle; and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2566 lists have their own tp_clear. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2567 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2568 slots (in PyHeapTypeObject): |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2569 A tuple of strings can't be part of a cycle. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2570 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2571 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2572 Py_CLEAR(type->tp_mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2573 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2574 return 0; |
|
20220
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2575 } |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2576 |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2577 static int |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2578 type_is_gc(PyTypeObject *type) |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2579 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2580 return type->tp_flags & Py_TPFLAGS_HEAPTYPE; |
|
20220
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2581 } |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
2582 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
2583 PyTypeObject PyType_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2584 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2585 "type", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2586 sizeof(PyHeapTypeObject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2587 sizeof(PyMemberDef), /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2588 (destructor)type_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2589 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2590 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2591 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2592 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2593 (reprfunc)type_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2594 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2595 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2596 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2597 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2598 (ternaryfunc)type_call, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2599 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2600 (getattrofunc)type_getattro, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2601 (setattrofunc)type_setattro, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2602 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2603 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2604 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS, /* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2605 type_doc, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2606 (traverseproc)type_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2607 (inquiry)type_clear, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2608 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2609 offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2610 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2611 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2612 type_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2613 type_members, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2614 type_getsets, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2615 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2616 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2617 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2618 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2619 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2620 type_init, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2621 0, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2622 type_new, /* tp_new */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2623 PyObject_GC_Del, /* tp_free */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2624 (inquiry)type_is_gc, /* tp_is_gc */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2625 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2626 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2627 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2628 /* The base type of all types (eventually)... except itself. */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2629 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2630 /* You may wonder why object.__new__() only complains about arguments |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2631 when object.__init__() is not overridden, and vice versa. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2632 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2633 Consider the use cases: |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2634 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2635 1. When neither is overridden, we want to hear complaints about |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2636 excess (i.e., any) arguments, since their presence could |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2637 indicate there's a bug. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2638 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2639 2. When defining an Immutable type, we are likely to override only |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2640 __new__(), since __init__() is called too late to initialize an |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2641 Immutable object. Since __new__() defines the signature for the |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2642 type, it would be a pain to have to override __init__() just to |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2643 stop it from complaining about excess arguments. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2644 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2645 3. When defining a Mutable type, we are likely to override only |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2646 __init__(). So here the converse reasoning applies: we don't |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2647 want to have to override __new__() just to stop it from |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2648 complaining. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2649 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2650 4. When __init__() is overridden, and the subclass __init__() calls |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2651 object.__init__(), the latter should complain about excess |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2652 arguments; ditto for __new__(). |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2653 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2654 Use cases 2 and 3 make it unattractive to unconditionally check for |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2655 excess arguments. The best solution that addresses all four use |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2656 cases is as follows: __init__() complains about excess arguments |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2657 unless __new__() is overridden and __init__() is not overridden |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2658 (IOW, if __init__() is overridden or __new__() is not overridden); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2659 symmetrically, __new__() complains about excess arguments unless |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2660 __init__() is overridden and __new__() is not overridden |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2661 (IOW, if __new__() is overridden or __init__() is not overridden). |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2662 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2663 However, for backwards compatibility, this breaks too much code. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2664 Therefore, in 2.6, we'll *warn* about excess arguments when both |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2665 methods are overridden; for all other cases we'll use the above |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2666 rules. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2667 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2668 */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2669 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2670 /* Forward */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2671 static PyObject * |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2672 object_new(PyTypeObject *type, PyObject *args, PyObject *kwds); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2673 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2674 static int |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2675 excess_args(PyObject *args, PyObject *kwds) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2676 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2677 return PyTuple_GET_SIZE(args) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2678 (kwds && PyDict_Check(kwds) && PyDict_Size(kwds)); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2679 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
2680 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2681 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2682 object_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2683 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2684 int err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2685 if (excess_args(args, kwds)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2686 PyTypeObject *type = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2687 if (type->tp_init != object_init && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2688 type->tp_new != object_new) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2689 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2690 err = PyErr_WarnEx(PyExc_DeprecationWarning, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2691 "object.__init__() takes no parameters", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2692 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2693 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2694 else if (type->tp_init != object_init || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2695 type->tp_new == object_new) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2696 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2697 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2698 "object.__init__() takes no parameters"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2699 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2700 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2701 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2702 return err; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2703 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2704 |
|
27866
bbbba0ee61fb
SF patch #685738 by Michael Stone.
Guido van Rossum <guido@python.org>
parents:
27831
diff
changeset
|
2705 static PyObject * |
|
bbbba0ee61fb
SF patch #685738 by Michael Stone.
Guido van Rossum <guido@python.org>
parents:
27831
diff
changeset
|
2706 object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
bbbba0ee61fb
SF patch #685738 by Michael Stone.
Guido van Rossum <guido@python.org>
parents:
27831
diff
changeset
|
2707 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2708 int err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2709 if (excess_args(args, kwds)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2710 if (type->tp_new != object_new && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2711 type->tp_init != object_init) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2712 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2713 err = PyErr_WarnEx(PyExc_DeprecationWarning, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2714 "object.__new__() takes no parameters", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2715 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2716 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2717 else if (type->tp_new != object_new || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2718 type->tp_init == object_init) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2719 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2720 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2721 "object.__new__() takes no parameters"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2722 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2723 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2724 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2725 if (err < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2726 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2727 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2728 if (type->tp_flags & Py_TPFLAGS_IS_ABSTRACT) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2729 static PyObject *comma = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2730 PyObject *abstract_methods = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2731 PyObject *builtins; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2732 PyObject *sorted; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2733 PyObject *sorted_methods = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2734 PyObject *joined = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2735 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2736 /* Compute ", ".join(sorted(type.__abstractmethods__)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2737 into joined. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2738 abstract_methods = type_abstractmethods(type, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2739 if (abstract_methods == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2740 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2741 builtins = PyEval_GetBuiltins(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2742 if (builtins == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2743 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2744 sorted = PyDict_GetItemString(builtins, "sorted"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2745 if (sorted == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2746 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2747 sorted_methods = PyObject_CallFunctionObjArgs(sorted, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2748 abstract_methods, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2749 NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2750 if (sorted_methods == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2751 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2752 if (comma == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2753 comma = PyUnicode_InternFromString(", "); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2754 if (comma == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2755 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2756 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2757 joined = PyObject_CallMethod(comma, "join", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2758 "O", sorted_methods); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2759 if (joined == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2760 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2761 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2762 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2763 "Can't instantiate abstract class %s " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2764 "with abstract methods %U", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2765 type->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2766 joined); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2767 error: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2768 Py_XDECREF(joined); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2769 Py_XDECREF(sorted_methods); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2770 Py_XDECREF(abstract_methods); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2771 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2772 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2773 return type->tp_alloc(type, 0); |
|
27866
bbbba0ee61fb
SF patch #685738 by Michael Stone.
Guido van Rossum <guido@python.org>
parents:
27831
diff
changeset
|
2774 } |
|
bbbba0ee61fb
SF patch #685738 by Michael Stone.
Guido van Rossum <guido@python.org>
parents:
27831
diff
changeset
|
2775 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2776 static void |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2777 object_dealloc(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2778 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2779 Py_TYPE(self)->tp_free(self); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2780 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2781 |
|
19194
7e9f5c59e9f2
Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents:
19192
diff
changeset
|
2782 static PyObject * |
|
7e9f5c59e9f2
Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents:
19192
diff
changeset
|
2783 object_repr(PyObject *self) |
|
7e9f5c59e9f2
Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents:
19192
diff
changeset
|
2784 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2785 PyTypeObject *type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2786 PyObject *mod, *name, *rtn; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2787 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2788 type = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2789 mod = type_module(type, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2790 if (mod == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2791 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2792 else if (!PyUnicode_Check(mod)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2793 Py_DECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2794 mod = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2795 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2796 name = type_name(type, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2797 if (name == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2798 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2799 if (mod != NULL && PyUnicode_CompareWithASCIIString(mod, "builtins")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2800 rtn = PyUnicode_FromFormat("<%U.%U object at %p>", mod, name, self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2801 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2802 rtn = PyUnicode_FromFormat("<%s object at %p>", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2803 type->tp_name, self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2804 Py_XDECREF(mod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2805 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2806 return rtn; |
|
19194
7e9f5c59e9f2
Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents:
19192
diff
changeset
|
2807 } |
|
7e9f5c59e9f2
Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents:
19192
diff
changeset
|
2808 |
|
19289
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
2809 static PyObject * |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
2810 object_str(PyObject *self) |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
2811 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2812 unaryfunc f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2813 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2814 f = Py_TYPE(self)->tp_repr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2815 if (f == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2816 f = object_repr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2817 return f(self); |
|
19289
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
2818 } |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
2819 |
|
20075
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2820 static PyObject * |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39624
diff
changeset
|
2821 object_richcompare(PyObject *self, PyObject *other, int op) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39624
diff
changeset
|
2822 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2823 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2824 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2825 switch (op) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2826 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2827 case Py_EQ: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2828 /* Return NotImplemented instead of False, so if two |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2829 objects are compared, both get a chance at the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2830 comparison. See issue #1393. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2831 res = (self == other) ? Py_True : Py_NotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2832 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2833 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2834 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2835 case Py_NE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2836 /* By default, != returns the opposite of ==, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2837 unless the latter returns NotImplemented. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2838 res = PyObject_RichCompare(self, other, Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2839 if (res != NULL && res != Py_NotImplemented) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2840 int ok = PyObject_IsTrue(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2841 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2842 if (ok < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2843 res = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2844 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2845 if (ok) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2846 res = Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2847 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2848 res = Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2849 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2850 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2851 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2852 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2853 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2854 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2855 res = Py_NotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2856 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2857 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2858 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2859 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2860 return res; |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39624
diff
changeset
|
2861 } |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39624
diff
changeset
|
2862 |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39624
diff
changeset
|
2863 static PyObject * |
|
20075
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2864 object_get_class(PyObject *self, void *closure) |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2865 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2866 Py_INCREF(Py_TYPE(self)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2867 return (PyObject *)(Py_TYPE(self)); |
|
20075
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2868 } |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2869 |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2870 static int |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2871 equiv_structs(PyTypeObject *a, PyTypeObject *b) |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2872 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2873 return a == b || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2874 (a != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2875 b != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2876 a->tp_basicsize == b->tp_basicsize && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2877 a->tp_itemsize == b->tp_itemsize && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2878 a->tp_dictoffset == b->tp_dictoffset && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2879 a->tp_weaklistoffset == b->tp_weaklistoffset && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2880 ((a->tp_flags & Py_TPFLAGS_HAVE_GC) == |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2881 (b->tp_flags & Py_TPFLAGS_HAVE_GC))); |
|
20075
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2882 } |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2883 |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2884 static int |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2885 same_slots_added(PyTypeObject *a, PyTypeObject *b) |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2886 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2887 PyTypeObject *base = a->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2888 Py_ssize_t size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2889 PyObject *slots_a, *slots_b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2890 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2891 if (base != b->tp_base) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2892 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2893 if (equiv_structs(a, base) && equiv_structs(b, base)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2894 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2895 size = base->tp_basicsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2896 if (a->tp_dictoffset == size && b->tp_dictoffset == size) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2897 size += sizeof(PyObject *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2898 if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2899 size += sizeof(PyObject *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2900 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2901 /* Check slots compliance */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2902 slots_a = ((PyHeapTypeObject *)a)->ht_slots; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2903 slots_b = ((PyHeapTypeObject *)b)->ht_slots; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2904 if (slots_a && slots_b) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2905 if (PyObject_RichCompareBool(slots_a, slots_b, Py_EQ) != 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2906 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2907 size += sizeof(PyObject *) * PyTuple_GET_SIZE(slots_a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2908 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2909 return size == a->tp_basicsize && size == b->tp_basicsize; |
|
20075
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2910 } |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2911 |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2912 static int |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37191
diff
changeset
|
2913 compatible_for_assignment(PyTypeObject* oldto, PyTypeObject* newto, char* attr) |
| 26421 | 2914 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2915 PyTypeObject *newbase, *oldbase; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2916 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2917 if (newto->tp_dealloc != oldto->tp_dealloc || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2918 newto->tp_free != oldto->tp_free) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2919 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2920 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2921 "%s assignment: " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2922 "'%s' deallocator differs from '%s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2923 attr, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2924 newto->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2925 oldto->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2926 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2927 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2928 newbase = newto; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2929 oldbase = oldto; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2930 while (equiv_structs(newbase, newbase->tp_base)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2931 newbase = newbase->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2932 while (equiv_structs(oldbase, oldbase->tp_base)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2933 oldbase = oldbase->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2934 if (newbase != oldbase && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2935 (newbase->tp_base != oldbase->tp_base || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2936 !same_slots_added(newbase, oldbase))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2937 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2938 "%s assignment: " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2939 "'%s' object layout differs from '%s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2940 attr, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2941 newto->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2942 oldto->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2943 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2944 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2945 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2946 return 1; |
| 26421 | 2947 } |
| 2948 | |
| 2949 static int | |
|
20075
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2950 object_set_class(PyObject *self, PyObject *value, void *closure) |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2951 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2952 PyTypeObject *oldto = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2953 PyTypeObject *newto; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2954 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2955 if (value == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2956 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2957 "can't delete __class__ attribute"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2958 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2959 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2960 if (!PyType_Check(value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2961 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2962 "__class__ must be set to new-style class, not '%s' object", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2963 Py_TYPE(value)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2964 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2965 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2966 newto = (PyTypeObject *)value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2967 if (!(newto->tp_flags & Py_TPFLAGS_HEAPTYPE) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2968 !(oldto->tp_flags & Py_TPFLAGS_HEAPTYPE)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2969 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2970 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2971 "__class__ assignment: only for heap types"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2972 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2973 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2974 if (compatible_for_assignment(newto, oldto, "__class__")) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2975 Py_INCREF(newto); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2976 Py_TYPE(self) = newto; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2977 Py_DECREF(oldto); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2978 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2979 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2980 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2981 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2982 } |
|
20075
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2983 } |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2984 |
|
aae5cf7e5861
Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents:
20063
diff
changeset
|
2985 static PyGetSetDef object_getsets[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2986 {"__class__", object_get_class, object_set_class, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2987 PyDoc_STR("the object's class")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
2988 {0} |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2989 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
2990 |
|
28016
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
2991 |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
2992 /* Stuff to implement __reduce_ex__ for pickle protocols >= 2. |
|
46867
dd5513b472dc
Rename copy_reg module to copyreg.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46644
diff
changeset
|
2993 We fall back to helpers in copyreg for: |
|
28016
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
2994 - pickle protocols < 2 |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
2995 - calculating the list of slot names (done only once per class) |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
2996 - the __newobj__ function (which is used as a token but never called) |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
2997 */ |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
2998 |
|
20084
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
2999 static PyObject * |
|
46867
dd5513b472dc
Rename copy_reg module to copyreg.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46644
diff
changeset
|
3000 import_copyreg(void) |
|
dd5513b472dc
Rename copy_reg module to copyreg.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46644
diff
changeset
|
3001 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3002 static PyObject *copyreg_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3003 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3004 if (!copyreg_str) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3005 copyreg_str = PyUnicode_InternFromString("copyreg"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3006 if (copyreg_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3007 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3008 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3009 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3010 return PyImport_Import(copyreg_str); |
|
28016
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3011 } |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3012 |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3013 static PyObject * |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3014 slotnames(PyObject *cls) |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3015 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3016 PyObject *clsdict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3017 PyObject *copyreg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3018 PyObject *slotnames; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3019 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3020 if (!PyType_Check(cls)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3021 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3022 return Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3023 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3024 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3025 clsdict = ((PyTypeObject *)cls)->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3026 slotnames = PyDict_GetItemString(clsdict, "__slotnames__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3027 if (slotnames != NULL && PyList_Check(slotnames)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3028 Py_INCREF(slotnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3029 return slotnames; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3030 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3031 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3032 copyreg = import_copyreg(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3033 if (copyreg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3034 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3035 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3036 slotnames = PyObject_CallMethod(copyreg, "_slotnames", "O", cls); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3037 Py_DECREF(copyreg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3038 if (slotnames != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3039 slotnames != Py_None && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3040 !PyList_Check(slotnames)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3041 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3042 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3043 "copyreg._slotnames didn't return a list or None"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3044 Py_DECREF(slotnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3045 slotnames = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3046 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3047 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3048 return slotnames; |
|
28016
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3049 } |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3050 |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3051 static PyObject * |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3052 reduce_2(PyObject *obj) |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3053 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3054 PyObject *cls, *getnewargs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3055 PyObject *args = NULL, *args2 = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3056 PyObject *getstate = NULL, *state = NULL, *names = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3057 PyObject *slots = NULL, *listitems = NULL, *dictitems = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3058 PyObject *copyreg = NULL, *newobj = NULL, *res = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3059 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3060 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3061 cls = PyObject_GetAttrString(obj, "__class__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3062 if (cls == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3063 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3064 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3065 getnewargs = PyObject_GetAttrString(obj, "__getnewargs__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3066 if (getnewargs != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3067 args = PyObject_CallObject(getnewargs, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3068 Py_DECREF(getnewargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3069 if (args != NULL && !PyTuple_Check(args)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3070 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3071 "__getnewargs__ should return a tuple, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3072 "not '%.200s'", Py_TYPE(args)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3073 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3074 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3075 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3076 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3077 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3078 args = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3079 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3080 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3081 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3082 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3083 getstate = PyObject_GetAttrString(obj, "__getstate__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3084 if (getstate != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3085 state = PyObject_CallObject(getstate, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3086 Py_DECREF(getstate); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3087 if (state == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3088 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3089 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3090 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3091 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3092 state = PyObject_GetAttrString(obj, "__dict__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3093 if (state == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3094 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3095 state = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3096 Py_INCREF(state); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3097 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3098 names = slotnames(cls); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3099 if (names == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3100 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3101 if (names != Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3102 assert(PyList_Check(names)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3103 slots = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3104 if (slots == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3105 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3106 n = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3107 /* Can't pre-compute the list size; the list |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3108 is stored on the class so accessible to other |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3109 threads, which may be run by DECREF */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3110 for (i = 0; i < PyList_GET_SIZE(names); i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3111 PyObject *name, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3112 name = PyList_GET_ITEM(names, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3113 value = PyObject_GetAttr(obj, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3114 if (value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3115 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3116 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3117 int err = PyDict_SetItem(slots, name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3118 value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3119 Py_DECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3120 if (err) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3121 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3122 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3123 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3124 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3125 if (n) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3126 state = Py_BuildValue("(NO)", state, slots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3127 if (state == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3128 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3129 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3130 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3131 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3132 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3133 if (!PyList_Check(obj)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3134 listitems = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3135 Py_INCREF(listitems); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3136 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3137 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3138 listitems = PyObject_GetIter(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3139 if (listitems == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3140 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3141 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3142 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3143 if (!PyDict_Check(obj)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3144 dictitems = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3145 Py_INCREF(dictitems); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3146 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3147 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3148 PyObject *items = PyObject_CallMethod(obj, "items", ""); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3149 if (items == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3150 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3151 dictitems = PyObject_GetIter(items); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3152 Py_DECREF(items); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3153 if (dictitems == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3154 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3155 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3156 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3157 copyreg = import_copyreg(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3158 if (copyreg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3159 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3160 newobj = PyObject_GetAttrString(copyreg, "__newobj__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3161 if (newobj == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3162 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3163 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3164 n = PyTuple_GET_SIZE(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3165 args2 = PyTuple_New(n+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3166 if (args2 == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3167 goto end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3168 PyTuple_SET_ITEM(args2, 0, cls); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3169 cls = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3170 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3171 PyObject *v = PyTuple_GET_ITEM(args, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3172 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3173 PyTuple_SET_ITEM(args2, i+1, v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3174 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3175 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3176 res = PyTuple_Pack(5, newobj, args2, state, listitems, dictitems); |
|
28016
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3177 |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3178 end: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3179 Py_XDECREF(cls); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3180 Py_XDECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3181 Py_XDECREF(args2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3182 Py_XDECREF(slots); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3183 Py_XDECREF(state); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3184 Py_XDECREF(names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3185 Py_XDECREF(listitems); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3186 Py_XDECREF(dictitems); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3187 Py_XDECREF(copyreg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3188 Py_XDECREF(newobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3189 return res; |
|
28016
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3190 } |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3191 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3192 /* |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3193 * There were two problems when object.__reduce__ and object.__reduce_ex__ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3194 * were implemented in the same function: |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3195 * - trying to pickle an object with a custom __reduce__ method that |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3196 * fell back to object.__reduce__ in certain circumstances led to |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3197 * infinite recursion at Python level and eventual RuntimeError. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3198 * - Pickling objects that lied about their type by overwriting the |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3199 * __class__ descriptor could lead to infinite recursion at C level |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3200 * and eventual segfault. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3201 * |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3202 * Because of backwards compatibility, the two methods still have to |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3203 * behave in the same way, even if this is not required by the pickle |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3204 * protocol. This common functionality was moved to the _common_reduce |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3205 * function. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3206 */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3207 static PyObject * |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3208 _common_reduce(PyObject *self, int proto) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3209 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3210 PyObject *copyreg, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3211 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3212 if (proto >= 2) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3213 return reduce_2(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3214 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3215 copyreg = import_copyreg(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3216 if (!copyreg) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3217 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3218 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3219 res = PyEval_CallMethod(copyreg, "_reduce_ex", "(Oi)", self, proto); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3220 Py_DECREF(copyreg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3221 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3222 return res; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3223 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3224 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3225 static PyObject * |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3226 object_reduce(PyObject *self, PyObject *args) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3227 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3228 int proto = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3229 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3230 if (!PyArg_ParseTuple(args, "|i:__reduce__", &proto)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3231 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3232 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3233 return _common_reduce(self, proto); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3234 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41501
diff
changeset
|
3235 |
|
28016
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3236 static PyObject * |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3237 object_reduce_ex(PyObject *self, PyObject *args) |
|
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3238 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3239 PyObject *reduce, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3240 int proto = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3241 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3242 if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3243 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3244 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3245 reduce = PyObject_GetAttrString(self, "__reduce__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3246 if (reduce == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3247 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3248 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3249 PyObject *cls, *clsreduce, *objreduce; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3250 int override; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3251 cls = PyObject_GetAttrString(self, "__class__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3252 if (cls == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3253 Py_DECREF(reduce); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3254 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3255 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3256 clsreduce = PyObject_GetAttrString(cls, "__reduce__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3257 Py_DECREF(cls); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3258 if (clsreduce == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3259 Py_DECREF(reduce); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3260 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3261 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3262 objreduce = PyDict_GetItemString(PyBaseObject_Type.tp_dict, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3263 "__reduce__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3264 override = (clsreduce != objreduce); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3265 Py_DECREF(clsreduce); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3266 if (override) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3267 res = PyObject_CallObject(reduce, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3268 Py_DECREF(reduce); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3269 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3270 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3271 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3272 Py_DECREF(reduce); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3273 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3274 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3275 return _common_reduce(self, proto); |
|
20084
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
3276 } |
|
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
3277 |
|
45549
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3278 static PyObject * |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3279 object_subclasshook(PyObject *cls, PyObject *args) |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3280 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3281 Py_INCREF(Py_NotImplemented); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3282 return Py_NotImplemented; |
|
45549
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3283 } |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3284 |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3285 PyDoc_STRVAR(object_subclasshook_doc, |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3286 "Abstract classes can override this to customize issubclass().\n" |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3287 "\n" |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3288 "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n" |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3289 "It should return True, False or NotImplemented. If it returns\n" |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3290 "NotImplemented, the normal algorithm is used. Otherwise, it\n" |
|
8dd30fe11a4b
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61083,61085,61092-61103 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45026
diff
changeset
|
3291 "overrides the normal algorithm (and the outcome is cached).\n"); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3292 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3293 /* |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3294 from PEP 3101, this code implements: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3295 |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3296 class object: |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3297 def __format__(self, format_spec): |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3298 return format(str(self), format_spec) |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3299 */ |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3300 static PyObject * |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3301 object_format(PyObject *self, PyObject *args) |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3302 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3303 PyObject *format_spec; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3304 PyObject *self_as_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3305 PyObject *result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3306 PyObject *format_meth = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3307 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3308 if (!PyArg_ParseTuple(args, "U:__format__", &format_spec)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3309 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3310 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3311 self_as_str = PyObject_Str(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3312 if (self_as_str != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3313 /* find the format function */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3314 format_meth = PyObject_GetAttrString(self_as_str, "__format__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3315 if (format_meth != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3316 /* and call it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3317 result = PyObject_CallFunctionObjArgs(format_meth, format_spec, NULL); |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3318 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3319 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3320 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3321 Py_XDECREF(self_as_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3322 Py_XDECREF(format_meth); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3323 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3324 return result; |
|
42817
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3325 } |
|
5355337709e1
Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents:
42673
diff
changeset
|
3326 |
|
47466
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3327 static PyObject * |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3328 object_sizeof(PyObject *self, PyObject *args) |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3329 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3330 Py_ssize_t res, isize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3331 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3332 res = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3333 isize = self->ob_type->tp_itemsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3334 if (isize > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3335 res = Py_SIZE(self->ob_type) * isize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3336 res += self->ob_type->tp_basicsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3337 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3338 return PyLong_FromSsize_t(res); |
|
47466
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3339 } |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
47301
diff
changeset
|
3340 |
|
20084
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
3341 static PyMethodDef object_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3342 {"__reduce_ex__", object_reduce_ex, METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3343 PyDoc_STR("helper for pickle")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3344 {"__reduce__", object_reduce, METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3345 PyDoc_STR("helper for pickle")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3346 {"__subclasshook__", object_subclasshook, METH_CLASS | METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3347 object_subclasshook_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3348 {"__format__", object_format, METH_VARARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3349 PyDoc_STR("default object formatter")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3350 {"__sizeof__", object_sizeof, METH_NOARGS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3351 PyDoc_STR("__sizeof__() -> size of object in memory, in bytes")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3352 {0} |
|
20084
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
3353 }; |
|
48e93ef3c5b7
- Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents:
20076
diff
changeset
|
3354 |
|
28016
b849482c70c6
Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents:
27948
diff
changeset
|
3355 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3356 PyTypeObject PyBaseObject_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3357 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3358 "object", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3359 sizeof(PyObject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3360 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3361 object_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3362 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3363 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3364 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3365 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3366 object_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3367 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3368 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3369 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3370 (hashfunc)_Py_HashPointer, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3371 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3372 object_str, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3373 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3374 PyObject_GenericSetAttr, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3375 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3376 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3377 PyDoc_STR("The most base type"), /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3378 0, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3379 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3380 object_richcompare, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3381 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3382 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3383 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3384 object_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3385 0, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3386 object_getsets, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3387 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3388 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3389 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3390 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3391 0, /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3392 object_init, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3393 PyType_GenericAlloc, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3394 object_new, /* tp_new */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3395 PyObject_Del, /* tp_free */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3396 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3397 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3398 |
|
39536
8f5b9982beba
Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
3399 /* Add the methods from tp_methods to the __dict__ in a type object */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3400 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3401 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3402 add_methods(PyTypeObject *type, PyMethodDef *meth) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3403 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3404 PyObject *dict = type->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3405 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3406 for (; meth->ml_name != NULL; meth++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3407 PyObject *descr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3408 if (PyDict_GetItemString(dict, meth->ml_name) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3409 !(meth->ml_flags & METH_COEXIST)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3410 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3411 if (meth->ml_flags & METH_CLASS) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3412 if (meth->ml_flags & METH_STATIC) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3413 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3414 "method cannot be both class and static"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3415 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3416 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3417 descr = PyDescr_NewClassMethod(type, meth); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3418 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3419 else if (meth->ml_flags & METH_STATIC) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3420 PyObject *cfunc = PyCFunction_New(meth, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3421 if (cfunc == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3422 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3423 descr = PyStaticMethod_New(cfunc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3424 Py_DECREF(cfunc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3425 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3426 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3427 descr = PyDescr_NewMethod(type, meth); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3428 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3429 if (descr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3430 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3431 if (PyDict_SetItemString(dict, meth->ml_name, descr) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3432 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3433 Py_DECREF(descr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3434 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3435 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3436 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3437 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3438 static int |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19970
diff
changeset
|
3439 add_members(PyTypeObject *type, PyMemberDef *memb) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3440 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3441 PyObject *dict = type->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3442 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3443 for (; memb->name != NULL; memb++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3444 PyObject *descr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3445 if (PyDict_GetItemString(dict, memb->name)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3446 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3447 descr = PyDescr_NewMember(type, memb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3448 if (descr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3449 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3450 if (PyDict_SetItemString(dict, memb->name, descr) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3451 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3452 Py_DECREF(descr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3453 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3454 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3455 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3456 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3457 static int |
|
20015
ca7af2a5d915
Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents:
20012
diff
changeset
|
3458 add_getset(PyTypeObject *type, PyGetSetDef *gsp) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3459 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3460 PyObject *dict = type->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3461 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3462 for (; gsp->name != NULL; gsp++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3463 PyObject *descr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3464 if (PyDict_GetItemString(dict, gsp->name)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3465 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3466 descr = PyDescr_NewGetSet(type, gsp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3467 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3468 if (descr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3469 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3470 if (PyDict_SetItemString(dict, gsp->name, descr) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3471 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3472 Py_DECREF(descr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3473 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3474 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3475 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3476 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3477 static void |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3478 inherit_special(PyTypeObject *type, PyTypeObject *base) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3479 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3480 Py_ssize_t oldsize, newsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3481 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3482 /* Copying basicsize is connected to the GC flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3483 oldsize = base->tp_basicsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3484 newsize = type->tp_basicsize ? type->tp_basicsize : oldsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3485 if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3486 (base->tp_flags & Py_TPFLAGS_HAVE_GC) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3487 (!type->tp_traverse && !type->tp_clear)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3488 type->tp_flags |= Py_TPFLAGS_HAVE_GC; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3489 if (type->tp_traverse == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3490 type->tp_traverse = base->tp_traverse; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3491 if (type->tp_clear == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3492 type->tp_clear = base->tp_clear; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3493 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3494 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3495 /* The condition below could use some explanation. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3496 It appears that tp_new is not inherited for static types |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3497 whose base class is 'object'; this seems to be a precaution |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3498 so that old extension types don't suddenly become |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3499 callable (object.__new__ wouldn't insure the invariants |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3500 that the extension type's own factory function ensures). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3501 Heap types, of course, are under our control, so they do |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3502 inherit tp_new; static extension types that specify some |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3503 other built-in type as the default are considered |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3504 new-style-aware so they also inherit object.__new__. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3505 if (base != &PyBaseObject_Type || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3506 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3507 if (type->tp_new == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3508 type->tp_new = base->tp_new; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3509 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3510 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3511 type->tp_basicsize = newsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3512 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3513 /* Copy other non-function slots */ |
|
19253
968d169501f2
Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents:
19194
diff
changeset
|
3514 |
|
968d169501f2
Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents:
19194
diff
changeset
|
3515 #undef COPYVAL |
|
968d169501f2
Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents:
19194
diff
changeset
|
3516 #define COPYVAL(SLOT) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3517 if (type->SLOT == 0) type->SLOT = base->SLOT |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3518 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3519 COPYVAL(tp_itemsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3520 COPYVAL(tp_weaklistoffset); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3521 COPYVAL(tp_dictoffset); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3522 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3523 /* Setup fast subclass flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3524 if (PyType_IsSubtype(base, (PyTypeObject*)PyExc_BaseException)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3525 type->tp_flags |= Py_TPFLAGS_BASE_EXC_SUBCLASS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3526 else if (PyType_IsSubtype(base, &PyType_Type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3527 type->tp_flags |= Py_TPFLAGS_TYPE_SUBCLASS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3528 else if (PyType_IsSubtype(base, &PyLong_Type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3529 type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3530 else if (PyType_IsSubtype(base, &PyBytes_Type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3531 type->tp_flags |= Py_TPFLAGS_BYTES_SUBCLASS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3532 else if (PyType_IsSubtype(base, &PyUnicode_Type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3533 type->tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3534 else if (PyType_IsSubtype(base, &PyTuple_Type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3535 type->tp_flags |= Py_TPFLAGS_TUPLE_SUBCLASS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3536 else if (PyType_IsSubtype(base, &PyList_Type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3537 type->tp_flags |= Py_TPFLAGS_LIST_SUBCLASS; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3538 else if (PyType_IsSubtype(base, &PyDict_Type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3539 type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS; |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3540 } |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3541 |
|
44407
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
3542 static char *hash_name_op[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3543 "__eq__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3544 "__hash__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3545 NULL |
|
39623
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
3546 }; |
|
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
3547 |
|
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
3548 static int |
|
44407
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
3549 overrides_hash(PyTypeObject *type) |
|
39623
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
3550 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3551 char **p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3552 PyObject *dict = type->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3553 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3554 assert(dict != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3555 for (p = hash_name_op; *p; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3556 if (PyDict_GetItemString(dict, *p) != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3557 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3558 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3559 return 0; |
|
39623
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
3560 } |
|
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
3561 |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3562 static void |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3563 inherit_slots(PyTypeObject *type, PyTypeObject *base) |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3564 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3565 PyTypeObject *basebase; |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3566 |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3567 #undef SLOTDEFINED |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3568 #undef COPYSLOT |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3569 #undef COPYNUM |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3570 #undef COPYSEQ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3571 #undef COPYMAP |
|
20386
3c01c34d07f6
Now that COPYBUF is a new local macro, add #undef COPYBUF.
Guido van Rossum <guido@python.org>
parents:
20384
diff
changeset
|
3572 #undef COPYBUF |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3573 |
|
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3574 #define SLOTDEFINED(SLOT) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3575 (base->SLOT != 0 && \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3576 (basebase == NULL || base->SLOT != basebase->SLOT)) |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3577 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3578 #define COPYSLOT(SLOT) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3579 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3580 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3581 #define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3582 #define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3583 #define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT) |
|
20384
2ba4018de2e3
SF bug [#470040] ParseTuple t# vs subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
20382
diff
changeset
|
3584 #define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3585 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3586 /* This won't inherit indirect slots (from tp_as_number etc.) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3587 if type doesn't provide the space. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3588 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3589 if (type->tp_as_number != NULL && base->tp_as_number != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3590 basebase = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3591 if (basebase->tp_as_number == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3592 basebase = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3593 COPYNUM(nb_add); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3594 COPYNUM(nb_subtract); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3595 COPYNUM(nb_multiply); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3596 COPYNUM(nb_remainder); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3597 COPYNUM(nb_divmod); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3598 COPYNUM(nb_power); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3599 COPYNUM(nb_negative); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3600 COPYNUM(nb_positive); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3601 COPYNUM(nb_absolute); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3602 COPYNUM(nb_bool); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3603 COPYNUM(nb_invert); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3604 COPYNUM(nb_lshift); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3605 COPYNUM(nb_rshift); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3606 COPYNUM(nb_and); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3607 COPYNUM(nb_xor); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3608 COPYNUM(nb_or); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3609 COPYNUM(nb_int); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3610 COPYNUM(nb_float); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3611 COPYNUM(nb_inplace_add); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3612 COPYNUM(nb_inplace_subtract); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3613 COPYNUM(nb_inplace_multiply); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3614 COPYNUM(nb_inplace_remainder); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3615 COPYNUM(nb_inplace_power); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3616 COPYNUM(nb_inplace_lshift); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3617 COPYNUM(nb_inplace_rshift); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3618 COPYNUM(nb_inplace_and); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3619 COPYNUM(nb_inplace_xor); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3620 COPYNUM(nb_inplace_or); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3621 COPYNUM(nb_true_divide); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3622 COPYNUM(nb_floor_divide); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3623 COPYNUM(nb_inplace_true_divide); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3624 COPYNUM(nb_inplace_floor_divide); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3625 COPYNUM(nb_index); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3626 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3627 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3628 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3629 basebase = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3630 if (basebase->tp_as_sequence == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3631 basebase = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3632 COPYSEQ(sq_length); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3633 COPYSEQ(sq_concat); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3634 COPYSEQ(sq_repeat); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3635 COPYSEQ(sq_item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3636 COPYSEQ(sq_ass_item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3637 COPYSEQ(sq_contains); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3638 COPYSEQ(sq_inplace_concat); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3639 COPYSEQ(sq_inplace_repeat); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3640 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3641 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3642 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3643 basebase = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3644 if (basebase->tp_as_mapping == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3645 basebase = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3646 COPYMAP(mp_length); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3647 COPYMAP(mp_subscript); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3648 COPYMAP(mp_ass_subscript); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3649 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3650 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3651 if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3652 basebase = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3653 if (basebase->tp_as_buffer == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3654 basebase = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3655 COPYBUF(bf_getbuffer); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3656 COPYBUF(bf_releasebuffer); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3657 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3658 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3659 basebase = base->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3660 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3661 COPYSLOT(tp_dealloc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3662 if (type->tp_getattr == NULL && type->tp_getattro == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3663 type->tp_getattr = base->tp_getattr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3664 type->tp_getattro = base->tp_getattro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3665 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3666 if (type->tp_setattr == NULL && type->tp_setattro == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3667 type->tp_setattr = base->tp_setattr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3668 type->tp_setattro = base->tp_setattro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3669 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3670 /* tp_reserved is ignored */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3671 COPYSLOT(tp_repr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3672 /* tp_hash see tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3673 COPYSLOT(tp_call); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3674 COPYSLOT(tp_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3675 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3676 /* Copy comparison-related slots only when |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3677 not overriding them anywhere */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3678 if (type->tp_richcompare == NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3679 type->tp_hash == NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3680 !overrides_hash(type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3681 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3682 type->tp_richcompare = base->tp_richcompare; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3683 type->tp_hash = base->tp_hash; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3684 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3685 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3686 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3687 COPYSLOT(tp_iter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3688 COPYSLOT(tp_iternext); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3689 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3690 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3691 COPYSLOT(tp_descr_get); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3692 COPYSLOT(tp_descr_set); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3693 COPYSLOT(tp_dictoffset); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3694 COPYSLOT(tp_init); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3695 COPYSLOT(tp_alloc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3696 COPYSLOT(tp_is_gc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3697 if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) == |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3698 (base->tp_flags & Py_TPFLAGS_HAVE_GC)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3699 /* They agree about gc. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3700 COPYSLOT(tp_free); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3701 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3702 else if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3703 type->tp_free == NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3704 base->tp_free == PyObject_Free) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3705 /* A bit of magic to plug in the correct default |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3706 * tp_free function when a derived class adds gc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3707 * didn't define tp_free, and the base uses the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3708 * default non-gc tp_free. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3709 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3710 type->tp_free = PyObject_GC_Del; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3711 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3712 /* else they didn't agree about gc, and there isn't something |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3713 * obvious to be done -- the type is on its own. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3714 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3715 } |
|
19153
64d4ad73a887
- Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents:
19136
diff
changeset
|
3716 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3717 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24250
diff
changeset
|
3718 static int add_operators(PyTypeObject *); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3719 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3720 int |
|
19040
4df72ea78ae8
- Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents:
19036
diff
changeset
|
3721 PyType_Ready(PyTypeObject *type) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3722 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3723 PyObject *dict, *bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3724 PyTypeObject *base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3725 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3726 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3727 if (type->tp_flags & Py_TPFLAGS_READY) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3728 assert(type->tp_dict != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3729 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3730 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3731 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3732 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3733 type->tp_flags |= Py_TPFLAGS_READYING; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3734 |
|
28389
4ede57a42c62
Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents:
28288
diff
changeset
|
3735 #ifdef Py_TRACE_REFS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3736 /* PyType_Ready is the closest thing we have to a choke point |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3737 * for type objects, so is the best place I can think of to try |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3738 * to get type objects into the doubly-linked list of all objects. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3739 * Still, not all type objects go thru PyType_Ready. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3740 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3741 _Py_AddToAllObjects((PyObject *)type, 0); |
|
28389
4ede57a42c62
Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents:
28288
diff
changeset
|
3742 #endif |
|
4ede57a42c62
Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents:
28288
diff
changeset
|
3743 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3744 /* Initialize tp_base (defaults to BaseObject unless that's us) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3745 base = type->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3746 if (base == NULL && type != &PyBaseObject_Type) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3747 base = type->tp_base = &PyBaseObject_Type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3748 Py_INCREF(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3749 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3750 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3751 /* Now the only way base can still be NULL is if type is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3752 * &PyBaseObject_Type. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3753 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3754 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3755 /* Initialize the base class */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3756 if (base != NULL && base->tp_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3757 if (PyType_Ready(base) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3758 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3759 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3760 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3761 /* Initialize ob_type if NULL. This means extensions that want to be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3762 compilable separately on Windows can call PyType_Ready() instead of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3763 initializing the ob_type field of their type objects. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3764 /* The test for base != NULL is really unnecessary, since base is only |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3765 NULL when type is &PyBaseObject_Type, and we know its ob_type is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3766 not NULL (it's initialized to &PyType_Type). But coverity doesn't |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3767 know that. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3768 if (Py_TYPE(type) == NULL && base != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3769 Py_TYPE(type) = Py_TYPE(base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3770 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3771 /* Initialize tp_bases */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3772 bases = type->tp_bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3773 if (bases == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3774 if (base == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3775 bases = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3776 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3777 bases = PyTuple_Pack(1, base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3778 if (bases == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3779 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3780 type->tp_bases = bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3781 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3782 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3783 /* Initialize tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3784 dict = type->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3785 if (dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3786 dict = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3787 if (dict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3788 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3789 type->tp_dict = dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3790 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3791 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3792 /* Add type-specific descriptors to tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3793 if (add_operators(type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3794 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3795 if (type->tp_methods != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3796 if (add_methods(type, type->tp_methods) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3797 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3798 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3799 if (type->tp_members != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3800 if (add_members(type, type->tp_members) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3801 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3802 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3803 if (type->tp_getset != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3804 if (add_getset(type, type->tp_getset) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3805 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3806 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3807 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3808 /* Calculate method resolution order */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3809 if (mro_internal(type) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3810 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3811 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3812 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3813 /* Inherit special flags from dominant base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3814 if (type->tp_base != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3815 inherit_special(type, type->tp_base); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3816 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3817 /* Initialize tp_dict properly */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3818 bases = type->tp_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3819 assert(bases != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3820 assert(PyTuple_Check(bases)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3821 n = PyTuple_GET_SIZE(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3822 for (i = 1; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3823 PyObject *b = PyTuple_GET_ITEM(bases, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3824 if (PyType_Check(b)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3825 inherit_slots(type, (PyTypeObject *)b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3826 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3827 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3828 /* Sanity check for tp_free. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3829 if (PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3830 (type->tp_free == NULL || type->tp_free == PyObject_Del)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3831 /* This base class needs to call tp_free, but doesn't have |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3832 * one, or its tp_free is for non-gc'ed objects. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3833 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3834 PyErr_Format(PyExc_TypeError, "type '%.100s' participates in " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3835 "gc and is a base type but has inappropriate " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3836 "tp_free slot", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3837 type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3838 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3839 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3840 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3841 /* if the type dictionary doesn't contain a __doc__, set it from |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3842 the tp_doc slot. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3843 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3844 if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3845 if (type->tp_doc != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3846 PyObject *doc = PyUnicode_FromString(type->tp_doc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3847 if (doc == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3848 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3849 PyDict_SetItemString(type->tp_dict, "__doc__", doc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3850 Py_DECREF(doc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3851 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3852 PyDict_SetItemString(type->tp_dict, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3853 "__doc__", Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3854 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3855 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3856 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3857 /* Hack for tp_hash and __hash__. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3858 If after all that, tp_hash is still NULL, and __hash__ is not in |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3859 tp_dict, set tp_hash to PyObject_HashNotImplemented and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3860 tp_dict['__hash__'] equal to None. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3861 This signals that __hash__ is not inherited. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3862 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3863 if (type->tp_hash == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3864 if (PyDict_GetItemString(type->tp_dict, "__hash__") == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3865 if (PyDict_SetItemString(type->tp_dict, "__hash__", Py_None) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3866 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3867 type->tp_hash = PyObject_HashNotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3868 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3869 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3870 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3871 /* Some more special stuff */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3872 base = type->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3873 if (base != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3874 if (type->tp_as_number == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3875 type->tp_as_number = base->tp_as_number; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3876 if (type->tp_as_sequence == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3877 type->tp_as_sequence = base->tp_as_sequence; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3878 if (type->tp_as_mapping == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3879 type->tp_as_mapping = base->tp_as_mapping; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3880 if (type->tp_as_buffer == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3881 type->tp_as_buffer = base->tp_as_buffer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3882 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3883 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3884 /* Link into each base class's list of subclasses */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3885 bases = type->tp_bases; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3886 n = PyTuple_GET_SIZE(bases); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3887 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3888 PyObject *b = PyTuple_GET_ITEM(bases, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3889 if (PyType_Check(b) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3890 add_subclass((PyTypeObject *)b, type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3891 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3892 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3893 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3894 /* Warn for a type that implements tp_compare (now known as |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3895 tp_reserved) but not tp_richcompare. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3896 if (type->tp_reserved && !type->tp_richcompare) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3897 int error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3898 char msg[240]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3899 PyOS_snprintf(msg, sizeof(msg), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3900 "Type %.100s defines tp_reserved (formerly " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3901 "tp_compare) but not tp_richcompare. " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3902 "Comparisons may not behave as intended.", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3903 type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3904 error = PyErr_WarnEx(PyExc_DeprecationWarning, msg, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3905 if (error == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3906 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3907 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3908 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3909 /* All done -- set the ready flag */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3910 assert(type->tp_dict != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3911 type->tp_flags = |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3912 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3913 return 0; |
|
19136
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
3914 |
|
6463cd9db2fc
Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents:
19109
diff
changeset
|
3915 error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3916 type->tp_flags &= ~Py_TPFLAGS_READYING; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3917 return -1; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3918 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3919 |
|
20315
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
3920 static int |
|
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
3921 add_subclass(PyTypeObject *base, PyTypeObject *type) |
|
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
3922 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3923 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3924 int result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3925 PyObject *list, *ref, *newobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3926 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3927 list = base->tp_subclasses; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3928 if (list == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3929 base->tp_subclasses = list = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3930 if (list == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3931 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3932 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3933 assert(PyList_Check(list)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3934 newobj = PyWeakref_NewRef((PyObject *)type, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3935 i = PyList_GET_SIZE(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3936 while (--i >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3937 ref = PyList_GET_ITEM(list, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3938 assert(PyWeakref_CheckRef(ref)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3939 if (PyWeakref_GET_OBJECT(ref) == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3940 return PyList_SetItem(list, i, newobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3941 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3942 result = PyList_Append(list, newobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3943 Py_DECREF(newobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3944 return result; |
|
20315
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
3945 } |
|
7b41f7a2e528
Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents:
20296
diff
changeset
|
3946 |
| 26421 | 3947 static void |
| 3948 remove_subclass(PyTypeObject *base, PyTypeObject *type) | |
| 3949 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3950 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3951 PyObject *list, *ref; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3952 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3953 list = base->tp_subclasses; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3954 if (list == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3955 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3956 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3957 assert(PyList_Check(list)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3958 i = PyList_GET_SIZE(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3959 while (--i >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3960 ref = PyList_GET_ITEM(list, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3961 assert(PyWeakref_CheckRef(ref)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3962 if (PyWeakref_GET_OBJECT(ref) == (PyObject*)type) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3963 /* this can't fail, right? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3964 PySequence_DelItem(list, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3965 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3966 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3967 } |
| 26421 | 3968 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3969 |
|
31176
381140e7e9d7
Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents:
31172
diff
changeset
|
3970 static int |
|
381140e7e9d7
Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents:
31172
diff
changeset
|
3971 check_num_args(PyObject *ob, int n) |
|
381140e7e9d7
Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents:
31172
diff
changeset
|
3972 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3973 if (!PyTuple_CheckExact(ob)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3974 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3975 "PyArg_UnpackTuple() argument list is not a tuple"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3976 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3977 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3978 if (n == PyTuple_GET_SIZE(ob)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3979 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3980 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3981 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3982 "expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3983 return 0; |
|
31176
381140e7e9d7
Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents:
31172
diff
changeset
|
3984 } |
|
381140e7e9d7
Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents:
31172
diff
changeset
|
3985 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3986 /* Generic wrappers for overloadable 'operators' such as __getitem__ */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3987 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3988 /* There's a wrapper *function* for each distinct function typedef used |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3989 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3990 wrapper *table* for each distinct operation (e.g. __len__, __add__). |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3991 Most tables have only one entry; the tables for binary operators have two |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3992 entries, one regular and one with reversed arguments. */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3993 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3994 static PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36169
diff
changeset
|
3995 wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
3996 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3997 lenfunc func = (lenfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3998 Py_ssize_t res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
3999 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4000 if (!check_num_args(args, 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4001 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4002 res = (*func)(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4003 if (res == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4004 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4005 return PyLong_FromLong((long)res); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4006 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4007 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4008 static PyObject * |
|
30670
7f6134f8bd06
SF bug #820397: __nonzero__() returns 1/0
Raymond Hettinger <python@rcn.com>
parents:
30660
diff
changeset
|
4009 wrap_inquirypred(PyObject *self, PyObject *args, void *wrapped) |
|
7f6134f8bd06
SF bug #820397: __nonzero__() returns 1/0
Raymond Hettinger <python@rcn.com>
parents:
30660
diff
changeset
|
4010 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4011 inquiry func = (inquiry)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4012 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4013 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4014 if (!check_num_args(args, 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4015 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4016 res = (*func)(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4017 if (res == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4018 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4019 return PyBool_FromLong((long)res); |
|
30670
7f6134f8bd06
SF bug #820397: __nonzero__() returns 1/0
Raymond Hettinger <python@rcn.com>
parents:
30660
diff
changeset
|
4020 } |
|
7f6134f8bd06
SF bug #820397: __nonzero__() returns 1/0
Raymond Hettinger <python@rcn.com>
parents:
30660
diff
changeset
|
4021 |
|
7f6134f8bd06
SF bug #820397: __nonzero__() returns 1/0
Raymond Hettinger <python@rcn.com>
parents:
30660
diff
changeset
|
4022 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4023 wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4024 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4025 binaryfunc func = (binaryfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4026 PyObject *other; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4027 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4028 if (!check_num_args(args, 1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4029 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4030 other = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4031 return (*func)(self, other); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4032 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4033 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4034 static PyObject * |
|
20328
26b5f8b94872
It turned out not so difficult to support old-style numbers (those
Guido van Rossum <guido@python.org>
parents:
20320
diff
changeset
|
4035 wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped) |
|
26b5f8b94872
It turned out not so difficult to support old-style numbers (those
Guido van Rossum <guido@python.org>
parents:
20320
diff
changeset
|
4036 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4037 binaryfunc func = (binaryfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4038 PyObject *other; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4039 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4040 if (!check_num_args(args, 1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4041 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4042 other = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4043 return (*func)(self, other); |
|
20328
26b5f8b94872
It turned out not so difficult to support old-style numbers (those
Guido van Rossum <guido@python.org>
parents:
20320
diff
changeset
|
4044 } |
|
26b5f8b94872
It turned out not so difficult to support old-style numbers (those
Guido van Rossum <guido@python.org>
parents:
20320
diff
changeset
|
4045 |
|
26b5f8b94872
It turned out not so difficult to support old-style numbers (those
Guido van Rossum <guido@python.org>
parents:
20320
diff
changeset
|
4046 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4047 wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4048 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4049 binaryfunc func = (binaryfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4050 PyObject *other; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4051 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4052 if (!check_num_args(args, 1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4053 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4054 other = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4055 return (*func)(other, self); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4056 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4057 |
|
20140
225f17ec8932
Merge branch changes (coercion, rich comparisons) into trunk.
Guido van Rossum <guido@python.org>
parents:
20095
diff
changeset
|
4058 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4059 wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4060 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4061 ternaryfunc func = (ternaryfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4062 PyObject *other; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4063 PyObject *third = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4064 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4065 /* Note: This wrapper only works for __pow__() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4066 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4067 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4068 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4069 return (*func)(self, other, third); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4070 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4071 |
|
20168
091e9e3ceeaf
Ouch. The wrapper for __rpow__ was the same as for __pow__, resulting
Guido van Rossum <guido@python.org>
parents:
20140
diff
changeset
|
4072 static PyObject * |
|
091e9e3ceeaf
Ouch. The wrapper for __rpow__ was the same as for __pow__, resulting
Guido van Rossum <guido@python.org>
parents:
20140
diff
changeset
|
4073 wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped) |
|
091e9e3ceeaf
Ouch. The wrapper for __rpow__ was the same as for __pow__, resulting
Guido van Rossum <guido@python.org>
parents:
20140
diff
changeset
|
4074 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4075 ternaryfunc func = (ternaryfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4076 PyObject *other; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4077 PyObject *third = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4078 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4079 /* Note: This wrapper only works for __pow__() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4080 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4081 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4082 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4083 return (*func)(other, self, third); |
|
20168
091e9e3ceeaf
Ouch. The wrapper for __rpow__ was the same as for __pow__, resulting
Guido van Rossum <guido@python.org>
parents:
20140
diff
changeset
|
4084 } |
|
091e9e3ceeaf
Ouch. The wrapper for __rpow__ was the same as for __pow__, resulting
Guido van Rossum <guido@python.org>
parents:
20140
diff
changeset
|
4085 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4086 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4087 wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4088 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4089 unaryfunc func = (unaryfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4090 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4091 if (!check_num_args(args, 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4092 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4093 return (*func)(self); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4094 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4095 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4096 static PyObject * |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37191
diff
changeset
|
4097 wrap_indexargfunc(PyObject *self, PyObject *args, void *wrapped) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4098 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4099 ssizeargfunc func = (ssizeargfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4100 PyObject* o; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4101 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4102 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4103 if (!PyArg_UnpackTuple(args, "", 1, 1, &o)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4104 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4105 i = PyNumber_AsSsize_t(o, PyExc_OverflowError); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4106 if (i == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4107 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4108 return (*func)(self, i); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4109 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4110 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36169
diff
changeset
|
4111 static Py_ssize_t |
|
19353
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4112 getindex(PyObject *self, PyObject *arg) |
|
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4113 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4114 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4115 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4116 i = PyNumber_AsSsize_t(arg, PyExc_OverflowError); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4117 if (i == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4118 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4119 if (i < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4120 PySequenceMethods *sq = Py_TYPE(self)->tp_as_sequence; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4121 if (sq && sq->sq_length) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4122 Py_ssize_t n = (*sq->sq_length)(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4123 if (n < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4124 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4125 i += n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4126 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4127 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4128 return i; |
|
19353
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4129 } |
|
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4130 |
|
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4131 static PyObject * |
|
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4132 wrap_sq_item(PyObject *self, PyObject *args, void *wrapped) |
|
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4133 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4134 ssizeargfunc func = (ssizeargfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4135 PyObject *arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4136 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4137 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4138 if (PyTuple_GET_SIZE(args) == 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4139 arg = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4140 i = getindex(self, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4141 if (i == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4142 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4143 return (*func)(self, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4144 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4145 check_num_args(args, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4146 assert(PyErr_Occurred()); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4147 return NULL; |
|
19353
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4148 } |
|
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4149 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4150 static PyObject * |
|
19353
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4151 wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4152 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4153 ssizeobjargproc func = (ssizeobjargproc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4154 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4155 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4156 PyObject *arg, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4157 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4158 if (!PyArg_UnpackTuple(args, "", 2, 2, &arg, &value)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4159 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4160 i = getindex(self, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4161 if (i == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4162 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4163 res = (*func)(self, i, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4164 if (res == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4165 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4166 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4167 return Py_None; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4168 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4169 |
|
18941
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
4170 static PyObject * |
|
19353
051d8e380f38
Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents:
19349
diff
changeset
|
4171 wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped) |
|
18941
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
4172 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4173 ssizeobjargproc func = (ssizeobjargproc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4174 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4175 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4176 PyObject *arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4177 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4178 if (!check_num_args(args, 1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4179 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4180 arg = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4181 i = getindex(self, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4182 if (i == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4183 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4184 res = (*func)(self, i, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4185 if (res == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4186 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4187 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4188 return Py_None; |
|
18941
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
4189 } |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
4190 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4191 /* XXX objobjproc is a misnomer; should be objargpred */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4192 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4193 wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4194 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4195 objobjproc func = (objobjproc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4196 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4197 PyObject *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4198 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4199 if (!check_num_args(args, 1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4200 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4201 value = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4202 res = (*func)(self, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4203 if (res == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4204 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4205 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4206 return PyBool_FromLong(res); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4207 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4208 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4209 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4210 wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4211 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4212 objobjargproc func = (objobjargproc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4213 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4214 PyObject *key, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4215 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4216 if (!PyArg_UnpackTuple(args, "", 2, 2, &key, &value)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4217 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4218 res = (*func)(self, key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4219 if (res == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4220 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4221 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4222 return Py_None; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4223 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4224 |
|
18941
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
4225 static PyObject * |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
4226 wrap_delitem(PyObject *self, PyObject *args, void *wrapped) |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
4227 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4228 objobjargproc func = (objobjargproc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4229 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4230 PyObject *key; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4231 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4232 if (!check_num_args(args, 1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4233 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4234 key = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4235 res = (*func)(self, key, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4236 if (res == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4237 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4238 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4239 return Py_None; |
|
18941
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
4240 } |
|
013cffcfd8a3
Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
4241 |
|
28608
8322077d234c
Close off the "Verre Carlo hack" as discussed on python-dev.
Guido van Rossum <guido@python.org>
parents:
28607
diff
changeset
|
4242 /* Helper to check for object.__setattr__ or __delattr__ applied to a type. |
|
28621
824dc28f922d
Ouch, it's Carlo Verre, not Verre Carlo.
Guido van Rossum <guido@python.org>
parents:
28608
diff
changeset
|
4243 This is called the Carlo Verre hack after its discoverer. */ |
|
28608
8322077d234c
Close off the "Verre Carlo hack" as discussed on python-dev.
Guido van Rossum <guido@python.org>
parents:
28607
diff
changeset
|
4244 static int |
|
8322077d234c
Close off the "Verre Carlo hack" as discussed on python-dev.
Guido van Rossum <guido@python.org>
parents:
28607
diff
changeset
|
4245 hackcheck(PyObject *self, setattrofunc func, char *what) |
|
8322077d234c
Close off the "Verre Carlo hack" as discussed on python-dev.
Guido van Rossum <guido@python.org>
parents:
28607
diff
changeset
|
4246 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4247 PyTypeObject *type = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4248 while (type && type->tp_flags & Py_TPFLAGS_HEAPTYPE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4249 type = type->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4250 /* If type is NULL now, this is a really weird type. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4251 In the spirit of backwards compatibility (?), just shut up. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4252 if (type && type->tp_setattro != func) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4253 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4254 "can't apply this %s to %s object", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4255 what, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4256 type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4257 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4258 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4259 return 1; |
|
28608
8322077d234c
Close off the "Verre Carlo hack" as discussed on python-dev.
Guido van Rossum <guido@python.org>
parents:
28607
diff
changeset
|
4260 } |
|
8322077d234c
Close off the "Verre Carlo hack" as discussed on python-dev.
Guido van Rossum <guido@python.org>
parents:
28607
diff
changeset
|
4261 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4262 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4263 wrap_setattr(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4264 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4265 setattrofunc func = (setattrofunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4266 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4267 PyObject *name, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4268 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4269 if (!PyArg_UnpackTuple(args, "", 2, 2, &name, &value)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4270 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4271 if (!hackcheck(self, func, "__setattr__")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4272 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4273 res = (*func)(self, name, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4274 if (res < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4275 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4276 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4277 return Py_None; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4278 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4279 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4280 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4281 wrap_delattr(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4282 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4283 setattrofunc func = (setattrofunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4284 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4285 PyObject *name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4286 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4287 if (!check_num_args(args, 1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4288 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4289 name = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4290 if (!hackcheck(self, func, "__delattr__")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4291 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4292 res = (*func)(self, name, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4293 if (res < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4294 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4295 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4296 return Py_None; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4297 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4298 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4299 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4300 wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4301 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4302 hashfunc func = (hashfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4303 long res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4304 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4305 if (!check_num_args(args, 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4306 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4307 res = (*func)(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4308 if (res == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4309 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4310 return PyLong_FromLong(res); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4311 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4312 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4313 static PyObject * |
|
20599
ff57a1a370b3
Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents:
20595
diff
changeset
|
4314 wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4315 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4316 ternaryfunc func = (ternaryfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4317 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4318 return (*func)(self, args, kwds); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4319 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4320 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4321 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4322 wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4323 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4324 richcmpfunc func = (richcmpfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4325 PyObject *other; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4326 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4327 if (!check_num_args(args, 1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4328 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4329 other = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4330 return (*func)(self, other, op); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4331 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4332 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4333 #undef RICHCMP_WRAPPER |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4334 #define RICHCMP_WRAPPER(NAME, OP) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4335 static PyObject * \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4336 richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4337 { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4338 return wrap_richcmpfunc(self, args, wrapped, OP); \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4339 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4340 |
|
19070
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
4341 RICHCMP_WRAPPER(lt, Py_LT) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
4342 RICHCMP_WRAPPER(le, Py_LE) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
4343 RICHCMP_WRAPPER(eq, Py_EQ) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
4344 RICHCMP_WRAPPER(ne, Py_NE) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
4345 RICHCMP_WRAPPER(gt, Py_GT) |
|
39a73c6773f1
Removed extraneous semicolons that caused a gazzilion "empty declaration" warnings in the MetroWerks compiler.
Jack Jansen <jack.jansen@cwi.nl>
parents:
19040
diff
changeset
|
4346 RICHCMP_WRAPPER(ge, Py_GE) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4347 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4348 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4349 wrap_next(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4350 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4351 unaryfunc func = (unaryfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4352 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4353 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4354 if (!check_num_args(args, 0)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4355 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4356 res = (*func)(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4357 if (res == NULL && !PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4358 PyErr_SetNone(PyExc_StopIteration); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4359 return res; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4360 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4361 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4362 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4363 wrap_descr_get(PyObject *self, PyObject *args, void *wrapped) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4364 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4365 descrgetfunc func = (descrgetfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4366 PyObject *obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4367 PyObject *type = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4368 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4369 if (!PyArg_UnpackTuple(args, "", 1, 2, &obj, &type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4370 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4371 if (obj == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4372 obj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4373 if (type == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4374 type = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4375 if (type == NULL &&obj == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4376 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4377 "__get__(None, None) is invalid"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4378 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4379 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4380 return (*func)(self, obj, type); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4381 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4382 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4383 static PyObject * |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
4384 wrap_descr_set(PyObject *self, PyObject *args, void *wrapped) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4385 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4386 descrsetfunc func = (descrsetfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4387 PyObject *obj, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4388 int ret; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4389 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4390 if (!PyArg_UnpackTuple(args, "", 2, 2, &obj, &value)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4391 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4392 ret = (*func)(self, obj, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4393 if (ret < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4394 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4395 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4396 return Py_None; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4397 } |
|
24614
40eb80dc4250
Fix SF bug 574207 (chained __slots__ dealloc segfault).
Guido van Rossum <guido@python.org>
parents:
24460
diff
changeset
|
4398 |
|
24460
2d77be41ee5f
SF patch 588728 (Nathan Srebro).
Guido van Rossum <guido@python.org>
parents:
24427
diff
changeset
|
4399 static PyObject * |
|
2d77be41ee5f
SF patch 588728 (Nathan Srebro).
Guido van Rossum <guido@python.org>
parents:
24427
diff
changeset
|
4400 wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped) |
|
2d77be41ee5f
SF patch 588728 (Nathan Srebro).
Guido van Rossum <guido@python.org>
parents:
24427
diff
changeset
|
4401 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4402 descrsetfunc func = (descrsetfunc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4403 PyObject *obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4404 int ret; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4405 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4406 if (!check_num_args(args, 1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4407 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4408 obj = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4409 ret = (*func)(self, obj, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4410 if (ret < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4411 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4412 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4413 return Py_None; |
|
24460
2d77be41ee5f
SF patch 588728 (Nathan Srebro).
Guido van Rossum <guido@python.org>
parents:
24427
diff
changeset
|
4414 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4415 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4416 static PyObject * |
|
20599
ff57a1a370b3
Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents:
20595
diff
changeset
|
4417 wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4418 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4419 initproc func = (initproc)wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4420 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4421 if (func(self, args, kwds) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4422 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4423 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4424 return Py_None; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4425 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4426 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4427 static PyObject * |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
4428 tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4429 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4430 PyTypeObject *type, *subtype, *staticbase; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4431 PyObject *arg0, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4432 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4433 if (self == NULL || !PyType_Check(self)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4434 Py_FatalError("__new__() called with non-type 'self'"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4435 type = (PyTypeObject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4436 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4437 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4438 "%s.__new__(): not enough arguments", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4439 type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4440 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4441 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4442 arg0 = PyTuple_GET_ITEM(args, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4443 if (!PyType_Check(arg0)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4444 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4445 "%s.__new__(X): X is not a type object (%s)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4446 type->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4447 Py_TYPE(arg0)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4448 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4449 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4450 subtype = (PyTypeObject *)arg0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4451 if (!PyType_IsSubtype(subtype, type)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4452 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4453 "%s.__new__(%s): %s is not a subtype of %s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4454 type->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4455 subtype->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4456 subtype->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4457 type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4458 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4459 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4460 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4461 /* Check that the use doesn't do something silly and unsafe like |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4462 object.__new__(dict). To do this, we check that the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4463 most derived base that's not a heap type is this type. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4464 staticbase = subtype; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4465 while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4466 staticbase = staticbase->tp_base; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4467 /* If staticbase is NULL now, it is a really weird type. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4468 In the spirit of backwards compatibility (?), just shut up. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4469 if (staticbase && staticbase->tp_new != type->tp_new) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4470 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4471 "%s.__new__(%s) is not safe, use %s.__new__()", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4472 type->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4473 subtype->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4474 staticbase == NULL ? "?" : staticbase->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4475 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4476 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4477 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4478 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4479 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4480 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4481 res = type->tp_new(subtype, args, kwds); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4482 Py_DECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4483 return res; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4484 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4485 |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
4486 static struct PyMethodDef tp_new_methoddef[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4487 {"__new__", (PyCFunction)tp_new_wrapper, METH_VARARGS|METH_KEYWORDS, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4488 PyDoc_STR("T.__new__(S, ...) -> " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4489 "a new object with type S, a subtype of T")}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4490 {0} |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4491 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4492 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4493 static int |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
4494 add_tp_new_wrapper(PyTypeObject *type) |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
4495 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4496 PyObject *func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4497 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4498 if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4499 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4500 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4501 if (func == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4502 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4503 if (PyDict_SetItemString(type->tp_dict, "__new__", func)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4504 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4505 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4506 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4507 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4508 return 0; |
|
19011
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
4509 } |
|
c1daa94c21d8
A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents:
18941
diff
changeset
|
4510 |
| 19036 | 4511 /* Slot wrappers that call the corresponding __foo__ slot. See comments |
| 4512 below at override_slots() for more explanation. */ | |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4513 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4514 #define SLOT0(FUNCNAME, OPSTR) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4515 static PyObject * \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4516 FUNCNAME(PyObject *self) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4517 { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4518 static PyObject *cache_str; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4519 return call_method(self, OPSTR, &cache_str, "()"); \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4520 } |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4521 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4522 #define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4523 static PyObject * \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4524 FUNCNAME(PyObject *self, ARG1TYPE arg1) \ |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4525 { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4526 static PyObject *cache_str; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4527 return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4528 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4529 |
|
27124
d1850a36ae41
Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents:
26964
diff
changeset
|
4530 /* Boolean helper for SLOT1BINFULL(). |
|
d1850a36ae41
Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents:
26964
diff
changeset
|
4531 right.__class__ is a nontrivial subclass of left.__class__. */ |
|
d1850a36ae41
Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents:
26964
diff
changeset
|
4532 static int |
|
d1850a36ae41
Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents:
26964
diff
changeset
|
4533 method_is_overloaded(PyObject *left, PyObject *right, char *name) |
|
d1850a36ae41
Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents:
26964
diff
changeset
|
4534 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4535 PyObject *a, *b; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4536 int ok; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4537 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4538 b = PyObject_GetAttrString((PyObject *)(Py_TYPE(right)), name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4539 if (b == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4540 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4541 /* If right doesn't have it, it's not overloaded */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4542 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4543 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4544 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4545 a = PyObject_GetAttrString((PyObject *)(Py_TYPE(left)), name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4546 if (a == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4547 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4548 Py_DECREF(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4549 /* If right has it but left doesn't, it's overloaded */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4550 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4551 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4552 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4553 ok = PyObject_RichCompareBool(a, b, Py_NE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4554 Py_DECREF(a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4555 Py_DECREF(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4556 if (ok < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4557 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4558 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4559 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4560 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4561 return ok; |
|
27124
d1850a36ae41
Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents:
26964
diff
changeset
|
4562 } |
|
d1850a36ae41
Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents:
26964
diff
changeset
|
4563 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4564 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4565 #define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4566 static PyObject * \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4567 FUNCNAME(PyObject *self, PyObject *other) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4568 { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4569 static PyObject *cache_str, *rcache_str; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4570 int do_other = Py_TYPE(self) != Py_TYPE(other) && \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4571 Py_TYPE(other)->tp_as_number != NULL && \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4572 Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4573 if (Py_TYPE(self)->tp_as_number != NULL && \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4574 Py_TYPE(self)->tp_as_number->SLOTNAME == TESTFUNC) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4575 PyObject *r; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4576 if (do_other && \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4577 PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self)) && \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4578 method_is_overloaded(self, other, ROPSTR)) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4579 r = call_maybe( \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4580 other, ROPSTR, &rcache_str, "(O)", self); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4581 if (r != Py_NotImplemented) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4582 return r; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4583 Py_DECREF(r); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4584 do_other = 0; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4585 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4586 r = call_maybe( \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4587 self, OPSTR, &cache_str, "(O)", other); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4588 if (r != Py_NotImplemented || \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4589 Py_TYPE(other) == Py_TYPE(self)) \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4590 return r; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4591 Py_DECREF(r); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4592 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4593 if (do_other) { \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4594 return call_maybe( \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4595 other, ROPSTR, &rcache_str, "(O)", self); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4596 } \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4597 Py_INCREF(Py_NotImplemented); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4598 return Py_NotImplemented; \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4599 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4600 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4601 #define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4602 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR) |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4603 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4604 #define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4605 static PyObject * \ |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4606 FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4607 { \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4608 static PyObject *cache_str; \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4609 return call_method(self, OPSTR, &cache_str, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4610 "(" ARGCODES ")", arg1, arg2); \ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4611 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4612 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36169
diff
changeset
|
4613 static Py_ssize_t |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4614 slot_sq_length(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4615 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4616 static PyObject *len_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4617 PyObject *res = call_method(self, "__len__", &len_str, "()"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4618 Py_ssize_t len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4619 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4620 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4621 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4622 len = PyNumber_AsSsize_t(res, PyExc_OverflowError); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4623 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4624 if (len < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4625 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4626 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4627 "__len__() should return >= 0"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4628 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4629 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4630 return len; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4631 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4632 |
|
20229
8bad55edfdf3
*EXPERIMENTAL* speedup of slot_sq_item. This sped up the following
Guido van Rossum <guido@python.org>
parents:
20225
diff
changeset
|
4633 /* Super-optimized version of slot_sq_item. |
|
8bad55edfdf3
*EXPERIMENTAL* speedup of slot_sq_item. This sped up the following
Guido van Rossum <guido@python.org>
parents:
20225
diff
changeset
|
4634 Other slots could do the same... */ |
|
8bad55edfdf3
*EXPERIMENTAL* speedup of slot_sq_item. This sped up the following
Guido van Rossum <guido@python.org>
parents:
20225
diff
changeset
|
4635 static PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36169
diff
changeset
|
4636 slot_sq_item(PyObject *self, Py_ssize_t i) |
|
20229
8bad55edfdf3
*EXPERIMENTAL* speedup of slot_sq_item. This sped up the following
Guido van Rossum <guido@python.org>
parents:
20225
diff
changeset
|
4637 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4638 static PyObject *getitem_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4639 PyObject *func, *args = NULL, *ival = NULL, *retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4640 descrgetfunc f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4641 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4642 if (getitem_str == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4643 getitem_str = PyUnicode_InternFromString("__getitem__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4644 if (getitem_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4645 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4646 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4647 func = _PyType_Lookup(Py_TYPE(self), getitem_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4648 if (func != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4649 if ((f = Py_TYPE(func)->tp_descr_get) == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4650 Py_INCREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4651 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4652 func = f(func, self, (PyObject *)(Py_TYPE(self))); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4653 if (func == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4654 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4655 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4656 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4657 ival = PyLong_FromSsize_t(i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4658 if (ival != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4659 args = PyTuple_New(1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4660 if (args != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4661 PyTuple_SET_ITEM(args, 0, ival); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4662 retval = PyObject_Call(func, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4663 Py_XDECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4664 Py_XDECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4665 return retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4666 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4667 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4668 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4669 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4670 PyErr_SetObject(PyExc_AttributeError, getitem_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4671 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4672 Py_XDECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4673 Py_XDECREF(ival); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4674 Py_XDECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4675 return NULL; |
|
20229
8bad55edfdf3
*EXPERIMENTAL* speedup of slot_sq_item. This sped up the following
Guido van Rossum <guido@python.org>
parents:
20225
diff
changeset
|
4676 } |
|
8bad55edfdf3
*EXPERIMENTAL* speedup of slot_sq_item. This sped up the following
Guido van Rossum <guido@python.org>
parents:
20225
diff
changeset
|
4677 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4678 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36169
diff
changeset
|
4679 slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4680 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4681 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4682 static PyObject *delitem_str, *setitem_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4683 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4684 if (value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4685 res = call_method(self, "__delitem__", &delitem_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4686 "(n)", index); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4687 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4688 res = call_method(self, "__setitem__", &setitem_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4689 "(nO)", index, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4690 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4691 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4692 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4693 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4694 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4695 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4696 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4697 slot_sq_contains(PyObject *self, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4698 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4699 PyObject *func, *res, *args; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4700 int result = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4701 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4702 static PyObject *contains_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4703 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4704 func = lookup_maybe(self, "__contains__", &contains_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4705 if (func != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4706 args = PyTuple_Pack(1, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4707 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4708 res = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4709 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4710 res = PyObject_Call(func, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4711 Py_DECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4712 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4713 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4714 if (res != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4715 result = PyObject_IsTrue(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4716 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4717 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4718 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4719 else if (! PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4720 /* Possible results: -1 and 1 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4721 result = (int)_PySequence_IterSearch(self, value, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4722 PY_ITERSEARCH_CONTAINS); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4723 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4724 return result; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4725 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4726 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4727 #define slot_mp_length slot_sq_length |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4728 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4729 SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4730 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4731 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4732 slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4733 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4734 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4735 static PyObject *delitem_str, *setitem_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4736 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4737 if (value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4738 res = call_method(self, "__delitem__", &delitem_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4739 "(O)", key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4740 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4741 res = call_method(self, "__setitem__", &setitem_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4742 "(OO)", key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4743 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4744 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4745 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4746 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4747 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4748 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4749 SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4750 SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4751 SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4752 SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4753 SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4754 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24250
diff
changeset
|
4755 static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *); |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4756 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4757 SLOT1BINFULL(slot_nb_power_binary, slot_nb_power, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4758 nb_power, "__pow__", "__rpow__") |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4759 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4760 static PyObject * |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4761 slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus) |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4762 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4763 static PyObject *pow_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4764 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4765 if (modulus == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4766 return slot_nb_power_binary(self, other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4767 /* Three-arg power doesn't use __rpow__. But ternary_op |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4768 can call this when the second argument's type uses |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4769 slot_nb_power, so check before calling self.__pow__. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4770 if (Py_TYPE(self)->tp_as_number != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4771 Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4772 return call_method(self, "__pow__", &pow_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4773 "(OO)", other, modulus); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4774 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4775 Py_INCREF(Py_NotImplemented); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4776 return Py_NotImplemented; |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4777 } |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4778 |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4779 SLOT0(slot_nb_negative, "__neg__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4780 SLOT0(slot_nb_positive, "__pos__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4781 SLOT0(slot_nb_absolute, "__abs__") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4782 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4783 static int |
|
40401
88133417dfd0
- patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents:
39703
diff
changeset
|
4784 slot_nb_bool(PyObject *self) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4785 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4786 PyObject *func, *args; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4787 static PyObject *bool_str, *len_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4788 int result = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4789 int using_len = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4790 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4791 func = lookup_maybe(self, "__bool__", &bool_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4792 if (func == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4793 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4794 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4795 func = lookup_maybe(self, "__len__", &len_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4796 if (func == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4797 return PyErr_Occurred() ? -1 : 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4798 using_len = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4799 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4800 args = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4801 if (args != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4802 PyObject *temp = PyObject_Call(func, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4803 Py_DECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4804 if (temp != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4805 if (using_len) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4806 /* enforced by slot_nb_len */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4807 result = PyObject_IsTrue(temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4808 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4809 else if (PyBool_Check(temp)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4810 result = PyObject_IsTrue(temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4811 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4812 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4813 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4814 "__bool__ should return " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4815 "bool, returned %s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4816 Py_TYPE(temp)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4817 result = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4818 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4819 Py_DECREF(temp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4820 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4821 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4822 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4823 return result; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4824 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4825 |
|
36882
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36866
diff
changeset
|
4826 |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39603
diff
changeset
|
4827 static PyObject * |
|
36882
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36866
diff
changeset
|
4828 slot_nb_index(PyObject *self) |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36866
diff
changeset
|
4829 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4830 static PyObject *index_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4831 return call_method(self, "__index__", &index_str, "()"); |
|
36882
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36866
diff
changeset
|
4832 } |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36866
diff
changeset
|
4833 |
|
6a9c7165b17b
Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents:
36866
diff
changeset
|
4834 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4835 SLOT0(slot_nb_invert, "__invert__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4836 SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4837 SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4838 SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4839 SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4840 SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__") |
|
20140
225f17ec8932
Merge branch changes (coercion, rich comparisons) into trunk.
Guido van Rossum <guido@python.org>
parents:
20095
diff
changeset
|
4841 |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4842 SLOT0(slot_nb_int, "__int__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4843 SLOT0(slot_nb_float, "__float__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4844 SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4845 SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4846 SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4847 SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O") |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40809
diff
changeset
|
4848 /* Can't use SLOT1 here, because nb_inplace_power is ternary */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4849 static PyObject * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4850 slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4851 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4852 static PyObject *cache_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4853 return call_method(self, "__ipow__", &cache_str, "(" "O" ")", arg1); |
|
40893
32c4897b5d46
Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40809
diff
changeset
|
4854 } |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4855 SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4856 SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4857 SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4858 SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4859 SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4860 SLOT1BIN(slot_nb_floor_divide, nb_floor_divide, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4861 "__floordiv__", "__rfloordiv__") |
|
19082
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4862 SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4863 SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O") |
|
88d124c74766
Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents:
19070
diff
changeset
|
4864 SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O") |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4865 |
|
19289
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
4866 static PyObject * |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
4867 slot_tp_repr(PyObject *self) |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
4868 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4869 PyObject *func, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4870 static PyObject *repr_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4871 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4872 func = lookup_method(self, "__repr__", &repr_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4873 if (func != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4874 res = PyEval_CallObject(func, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4875 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4876 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4877 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4878 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4879 return PyUnicode_FromFormat("<%s object at %p>", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4880 Py_TYPE(self)->tp_name, self); |
|
19289
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
4881 } |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
4882 |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
4883 static PyObject * |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
4884 slot_tp_str(PyObject *self) |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
4885 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4886 PyObject *func, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4887 static PyObject *str_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4888 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4889 func = lookup_method(self, "__str__", &str_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4890 if (func != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4891 res = PyEval_CallObject(func, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4892 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4893 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4894 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4895 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4896 PyObject *ress; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4897 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4898 res = slot_tp_repr(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4899 if (!res) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4900 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4901 ress = _PyUnicode_AsDefaultEncodedString(res, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4902 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4903 return ress; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4904 } |
|
19289
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
4905 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4906 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4907 static long |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4908 slot_tp_hash(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4909 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4910 PyObject *func, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4911 static PyObject *hash_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4912 long h; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4913 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4914 func = lookup_method(self, "__hash__", &hash_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4915 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4916 if (func == Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4917 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4918 func = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4919 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4920 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4921 if (func == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4922 return PyObject_HashNotImplemented(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4923 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4924 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4925 res = PyEval_CallObject(func, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4926 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4927 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4928 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4929 if (PyLong_Check(res)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4930 h = PyLong_Type.tp_hash(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4931 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4932 h = PyLong_AsLong(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4933 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4934 if (h == -1 && !PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4935 h = -2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4936 return h; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4937 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4938 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4939 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4940 slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4941 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4942 static PyObject *call_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4943 PyObject *meth = lookup_method(self, "__call__", &call_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4944 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4945 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4946 if (meth == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4947 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4948 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4949 res = PyObject_Call(meth, args, kwds); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4950 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4951 Py_DECREF(meth); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4952 return res; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4953 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4954 |
|
20499
a0c8c2e5a44d
Remove a bunch of stuff that's no longer needed now that update_slot()
Guido van Rossum <guido@python.org>
parents:
20489
diff
changeset
|
4955 /* There are two slot dispatch functions for tp_getattro. |
|
a0c8c2e5a44d
Remove a bunch of stuff that's no longer needed now that update_slot()
Guido van Rossum <guido@python.org>
parents:
20489
diff
changeset
|
4956 |
|
a0c8c2e5a44d
Remove a bunch of stuff that's no longer needed now that update_slot()
Guido van Rossum <guido@python.org>
parents:
20489
diff
changeset
|
4957 - slot_tp_getattro() is used when __getattribute__ is overridden |
|
a0c8c2e5a44d
Remove a bunch of stuff that's no longer needed now that update_slot()
Guido van Rossum <guido@python.org>
parents:
20489
diff
changeset
|
4958 but no __getattr__ hook is present; |
|
a0c8c2e5a44d
Remove a bunch of stuff that's no longer needed now that update_slot()
Guido van Rossum <guido@python.org>
parents:
20489
diff
changeset
|
4959 |
|
a0c8c2e5a44d
Remove a bunch of stuff that's no longer needed now that update_slot()
Guido van Rossum <guido@python.org>
parents:
20489
diff
changeset
|
4960 - slot_tp_getattr_hook() is used when a __getattr__ hook is present. |
|
a0c8c2e5a44d
Remove a bunch of stuff that's no longer needed now that update_slot()
Guido van Rossum <guido@python.org>
parents:
20489
diff
changeset
|
4961 |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
4962 The code in update_one_slot() always installs slot_tp_getattr_hook(); this |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
4963 detects the absence of __getattr__ and then installs the simpler slot if |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
4964 necessary. */ |
|
20499
a0c8c2e5a44d
Remove a bunch of stuff that's no longer needed now that update_slot()
Guido van Rossum <guido@python.org>
parents:
20489
diff
changeset
|
4965 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4966 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4967 slot_tp_getattro(PyObject *self, PyObject *name) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4968 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4969 static PyObject *getattribute_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4970 return call_method(self, "__getattribute__", &getattribute_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4971 "(O)", name); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4972 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
4973 |
|
20028
df1b83fd0ebb
Add the __getattr__ hook back. The rules are now:
Guido van Rossum <guido@python.org>
parents:
20021
diff
changeset
|
4974 static PyObject * |
|
49742
356c3e18da5e
Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49518
diff
changeset
|
4975 call_attribute(PyObject *self, PyObject *attr, PyObject *name) |
|
356c3e18da5e
Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49518
diff
changeset
|
4976 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4977 PyObject *res, *descr = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4978 descrgetfunc f = Py_TYPE(attr)->tp_descr_get; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4979 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4980 if (f != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4981 descr = f(attr, self, (PyObject *)(Py_TYPE(self))); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4982 if (descr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4983 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4984 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4985 attr = descr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4986 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4987 res = PyObject_CallFunctionObjArgs(attr, name, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4988 Py_XDECREF(descr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4989 return res; |
|
49742
356c3e18da5e
Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49518
diff
changeset
|
4990 } |
|
356c3e18da5e
Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49518
diff
changeset
|
4991 |
|
356c3e18da5e
Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49518
diff
changeset
|
4992 static PyObject * |
|
20028
df1b83fd0ebb
Add the __getattr__ hook back. The rules are now:
Guido van Rossum <guido@python.org>
parents:
20021
diff
changeset
|
4993 slot_tp_getattr_hook(PyObject *self, PyObject *name) |
|
df1b83fd0ebb
Add the __getattr__ hook back. The rules are now:
Guido van Rossum <guido@python.org>
parents:
20021
diff
changeset
|
4994 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4995 PyTypeObject *tp = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4996 PyObject *getattr, *getattribute, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4997 static PyObject *getattribute_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4998 static PyObject *getattr_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
4999 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5000 if (getattr_str == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5001 getattr_str = PyUnicode_InternFromString("__getattr__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5002 if (getattr_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5003 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5004 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5005 if (getattribute_str == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5006 getattribute_str = |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5007 PyUnicode_InternFromString("__getattribute__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5008 if (getattribute_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5009 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5010 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5011 /* speed hack: we could use lookup_maybe, but that would resolve the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5012 method fully for each attribute lookup for classes with |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5013 __getattr__, even when the attribute is present. So we use |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5014 _PyType_Lookup and create the method only when needed, with |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5015 call_attribute. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5016 getattr = _PyType_Lookup(tp, getattr_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5017 if (getattr == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5018 /* No __getattr__ hook: use a simpler dispatcher */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5019 tp->tp_getattro = slot_tp_getattro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5020 return slot_tp_getattro(self, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5021 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5022 Py_INCREF(getattr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5023 /* speed hack: we could use lookup_maybe, but that would resolve the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5024 method fully for each attribute lookup for classes with |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5025 __getattr__, even when self has the default __getattribute__ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5026 method. So we use _PyType_Lookup and create the method only when |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5027 needed, with call_attribute. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5028 getattribute = _PyType_Lookup(tp, getattribute_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5029 if (getattribute == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5030 (Py_TYPE(getattribute) == &PyWrapperDescr_Type && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5031 ((PyWrapperDescrObject *)getattribute)->d_wrapped == |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5032 (void *)PyObject_GenericGetAttr)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5033 res = PyObject_GenericGetAttr(self, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5034 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5035 Py_INCREF(getattribute); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5036 res = call_attribute(self, getattribute, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5037 Py_DECREF(getattribute); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5038 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5039 if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5040 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5041 res = call_attribute(self, getattr, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5042 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5043 Py_DECREF(getattr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5044 return res; |
|
20028
df1b83fd0ebb
Add the __getattr__ hook back. The rules are now:
Guido van Rossum <guido@python.org>
parents:
20021
diff
changeset
|
5045 } |
|
df1b83fd0ebb
Add the __getattr__ hook back. The rules are now:
Guido van Rossum <guido@python.org>
parents:
20021
diff
changeset
|
5046 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5047 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5048 slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5049 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5050 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5051 static PyObject *delattr_str, *setattr_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5052 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5053 if (value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5054 res = call_method(self, "__delattr__", &delattr_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5055 "(O)", name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5056 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5057 res = call_method(self, "__setattr__", &setattr_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5058 "(OO)", name, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5059 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5060 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5061 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5062 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5063 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5064 |
|
44407
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
5065 static char *name_op[] = { |
|
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
5066 "__lt__", |
|
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
5067 "__le__", |
|
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
5068 "__eq__", |
|
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
5069 "__ne__", |
|
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
5070 "__gt__", |
|
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
5071 "__ge__", |
|
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
5072 }; |
|
dda29e712815
Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents:
44351
diff
changeset
|
5073 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5074 static PyObject * |
|
19289
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5075 half_richcompare(PyObject *self, PyObject *other, int op) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5076 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5077 PyObject *func, *args, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5078 static PyObject *op_str[6]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5079 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5080 func = lookup_method(self, name_op[op], &op_str[op]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5081 if (func == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5082 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5083 Py_INCREF(Py_NotImplemented); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5084 return Py_NotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5085 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5086 args = PyTuple_Pack(1, other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5087 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5088 res = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5089 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5090 res = PyObject_Call(func, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5091 Py_DECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5092 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5093 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5094 return res; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5095 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5096 |
|
19289
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5097 static PyObject * |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5098 slot_tp_richcompare(PyObject *self, PyObject *other, int op) |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5099 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5100 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5101 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5102 if (Py_TYPE(self)->tp_richcompare == slot_tp_richcompare) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5103 res = half_richcompare(self, other, op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5104 if (res != Py_NotImplemented) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5105 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5106 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5107 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5108 if (Py_TYPE(other)->tp_richcompare == slot_tp_richcompare) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5109 res = half_richcompare(other, self, _Py_SwappedOp[op]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5110 if (res != Py_NotImplemented) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5111 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5112 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5113 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5114 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5115 Py_INCREF(Py_NotImplemented); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5116 return Py_NotImplemented; |
|
19289
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5117 } |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5118 |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5119 static PyObject * |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5120 slot_tp_iter(PyObject *self) |
|
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5121 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5122 PyObject *func, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5123 static PyObject *iter_str, *getitem_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5124 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5125 func = lookup_method(self, "__iter__", &iter_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5126 if (func != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5127 PyObject *args; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5128 args = res = PyTuple_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5129 if (args != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5130 res = PyObject_Call(func, args, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5131 Py_DECREF(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5132 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5133 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5134 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5135 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5136 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5137 func = lookup_method(self, "__getitem__", &getitem_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5138 if (func == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5139 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5140 "'%.200s' object is not iterable", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5141 Py_TYPE(self)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5142 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5143 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5144 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5145 return PySeqIter_New(self); |
|
19289
5c2bf6cde123
- Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents:
19253
diff
changeset
|
5146 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5147 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5148 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5149 slot_tp_iternext(PyObject *self) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5150 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5151 static PyObject *next_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5152 return call_method(self, "__next__", &next_str, "()"); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5153 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5154 |
|
19339
6130deeb4cc6
type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents:
19329
diff
changeset
|
5155 static PyObject * |
|
6130deeb4cc6
type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents:
19329
diff
changeset
|
5156 slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type) |
|
6130deeb4cc6
type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents:
19329
diff
changeset
|
5157 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5158 PyTypeObject *tp = Py_TYPE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5159 PyObject *get; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5160 static PyObject *get_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5161 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5162 if (get_str == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5163 get_str = PyUnicode_InternFromString("__get__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5164 if (get_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5165 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5166 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5167 get = _PyType_Lookup(tp, get_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5168 if (get == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5169 /* Avoid further slowdowns */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5170 if (tp->tp_descr_get == slot_tp_descr_get) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5171 tp->tp_descr_get = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5172 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5173 return self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5174 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5175 if (obj == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5176 obj = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5177 if (type == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5178 type = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5179 return PyObject_CallFunctionObjArgs(get, self, obj, type, NULL); |
|
19339
6130deeb4cc6
type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents:
19329
diff
changeset
|
5180 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5181 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5182 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5183 slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5184 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5185 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5186 static PyObject *del_str, *set_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5187 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5188 if (value == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5189 res = call_method(self, "__delete__", &del_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5190 "(O)", target); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5191 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5192 res = call_method(self, "__set__", &set_str, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5193 "(OO)", target, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5194 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5195 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5196 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5197 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5198 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5199 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5200 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5201 slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5202 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5203 static PyObject *init_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5204 PyObject *meth = lookup_method(self, "__init__", &init_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5205 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5206 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5207 if (meth == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5208 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5209 res = PyObject_Call(meth, args, kwds); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5210 Py_DECREF(meth); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5211 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5212 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5213 if (res != Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5214 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5215 "__init__() should return None, not '%.200s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5216 Py_TYPE(res)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5217 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5218 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5219 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5220 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5221 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5222 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5223 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5224 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5225 slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5226 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5227 static PyObject *new_str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5228 PyObject *func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5229 PyObject *newargs, *x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5230 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5231 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5232 if (new_str == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5233 new_str = PyUnicode_InternFromString("__new__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5234 if (new_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5235 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5236 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5237 func = PyObject_GetAttr((PyObject *)type, new_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5238 if (func == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5239 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5240 assert(PyTuple_Check(args)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5241 n = PyTuple_GET_SIZE(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5242 newargs = PyTuple_New(n+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5243 if (newargs == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5244 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5245 Py_INCREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5246 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5247 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5248 x = PyTuple_GET_ITEM(args, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5249 Py_INCREF(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5250 PyTuple_SET_ITEM(newargs, i+1, x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5251 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5252 x = PyObject_Call(func, newargs, kwds); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5253 Py_DECREF(newargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5254 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5255 return x; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5256 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5257 |
|
24678
71dca7c76fa2
A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents:
24653
diff
changeset
|
5258 static void |
|
71dca7c76fa2
A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents:
24653
diff
changeset
|
5259 slot_tp_del(PyObject *self) |
|
71dca7c76fa2
A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents:
24653
diff
changeset
|
5260 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5261 static PyObject *del_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5262 PyObject *del, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5263 PyObject *error_type, *error_value, *error_traceback; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5264 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5265 /* Temporarily resurrect the object. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5266 assert(self->ob_refcnt == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5267 self->ob_refcnt = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5268 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5269 /* Save the current exception, if any. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5270 PyErr_Fetch(&error_type, &error_value, &error_traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5271 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5272 /* Execute __del__ method, if any. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5273 del = lookup_maybe(self, "__del__", &del_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5274 if (del != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5275 res = PyEval_CallObject(del, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5276 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5277 PyErr_WriteUnraisable(del); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5278 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5279 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5280 Py_DECREF(del); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5281 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5282 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5283 /* Restore the saved exception. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5284 PyErr_Restore(error_type, error_value, error_traceback); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5285 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5286 /* Undo the temporary resurrection; can't use DECREF here, it would |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5287 * cause a recursive call. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5288 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5289 assert(self->ob_refcnt > 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5290 if (--self->ob_refcnt == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5291 return; /* this is the normal path out */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5292 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5293 /* __del__ resurrected it! Make it look like the original Py_DECREF |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5294 * never happened. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5295 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5296 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5297 Py_ssize_t refcnt = self->ob_refcnt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5298 _Py_NewReference(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5299 self->ob_refcnt = refcnt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5300 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5301 assert(!PyType_IS_GC(Py_TYPE(self)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5302 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5303 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5304 * we need to undo that. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5305 _Py_DEC_REFTOTAL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5306 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5307 * chain, so no more to do there. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5308 * If COUNT_ALLOCS, the original decref bumped tp_frees, and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5309 * _Py_NewReference bumped tp_allocs: both of those need to be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5310 * undone. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5311 */ |
|
24678
71dca7c76fa2
A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents:
24653
diff
changeset
|
5312 #ifdef COUNT_ALLOCS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5313 --Py_TYPE(self)->tp_frees; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5314 --Py_TYPE(self)->tp_allocs; |
|
24678
71dca7c76fa2
A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents:
24653
diff
changeset
|
5315 #endif |
|
71dca7c76fa2
A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents:
24653
diff
changeset
|
5316 } |
|
71dca7c76fa2
A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents:
24653
diff
changeset
|
5317 |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5318 |
|
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5319 /* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper |
|
28390
33319458fe99
slot_sq_contains(): This leaked a reference to the result of calling
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
5320 functions. The offsets here are relative to the 'PyHeapTypeObject' |
|
28219
7c8e8807aed2
- The extended type structure used for heap types (new-style
Guido van Rossum <guido@python.org>
parents:
28016
diff
changeset
|
5321 structure, which incorporates the additional structures used for numbers, |
|
7c8e8807aed2
- The extended type structure used for heap types (new-style
Guido van Rossum <guido@python.org>
parents:
28016
diff
changeset
|
5322 sequences and mappings. |
|
7c8e8807aed2
- The extended type structure used for heap types (new-style
Guido van Rossum <guido@python.org>
parents:
28016
diff
changeset
|
5323 Note that multiple names may map to the same slot (e.g. __eq__, |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5324 __ne__ etc. all map to tp_richcompare) and one name may map to multiple |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5325 slots (e.g. __str__ affects tp_str as well as tp_repr). The table is |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5326 terminated with an all-zero entry. (This table is further initialized and |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5327 sorted in init_slotdefs() below.) */ |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5328 |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5329 typedef struct wrapperbase slotdef; |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5330 |
|
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5331 #undef TPSLOT |
|
20599
ff57a1a370b3
Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents:
20595
diff
changeset
|
5332 #undef FLSLOT |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5333 #undef ETSLOT |
|
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5334 #undef SQSLOT |
|
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5335 #undef MPSLOT |
|
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5336 #undef NBSLOT |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5337 #undef UNSLOT |
|
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5338 #undef IBSLOT |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5339 #undef BINSLOT |
|
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5340 #undef RBINSLOT |
|
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5341 |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5342 #define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5343 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5344 PyDoc_STR(DOC)} |
|
20599
ff57a1a370b3
Methods of built-in types now properly check for keyword arguments
Guido van Rossum <guido@python.org>
parents:
20595
diff
changeset
|
5345 #define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5346 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5347 PyDoc_STR(DOC), FLAGS} |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5348 #define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5349 {NAME, offsetof(PyHeapTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5350 PyDoc_STR(DOC)} |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5351 #define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5352 ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC) |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5353 #define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5354 ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC) |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5355 #define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5356 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC) |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5357 #define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5358 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5359 "x." NAME "() <==> " DOC) |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5360 #define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5361 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5362 "x." NAME "(y) <==> x" DOC "y") |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5363 #define BINSLOT(NAME, SLOT, FUNCTION, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5364 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5365 "x." NAME "(y) <==> x" DOC "y") |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5366 #define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5367 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5368 "x." NAME "(y) <==> y" DOC "x") |
|
35004
8880d91cdb09
fix object.__divmod__.__doc__
Anthony Baxter <anthonybaxter@gmail.com>
parents:
34958
diff
changeset
|
5369 #define BINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5370 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5371 "x." NAME "(y) <==> " DOC) |
|
35004
8880d91cdb09
fix object.__divmod__.__doc__
Anthony Baxter <anthonybaxter@gmail.com>
parents:
34958
diff
changeset
|
5372 #define RBINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5373 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5374 "x." NAME "(y) <==> " DOC) |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5375 |
|
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5376 static slotdef slotdefs[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5377 SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5378 "x.__len__() <==> len(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5379 /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5380 The logic in abstract.c always falls back to nb_add/nb_multiply in |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5381 this case. Defining both the nb_* and the sq_* slots to call the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5382 user-defined methods has unexpected side-effects, as shown by |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5383 test_descr.notimplemented() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5384 SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5385 "x.__add__(y) <==> x+y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5386 SQSLOT("__mul__", sq_repeat, NULL, wrap_indexargfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5387 "x.__mul__(n) <==> x*n"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5388 SQSLOT("__rmul__", sq_repeat, NULL, wrap_indexargfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5389 "x.__rmul__(n) <==> n*x"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5390 SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5391 "x.__getitem__(y) <==> x[y]"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5392 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5393 "x.__setitem__(i, y) <==> x[i]=y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5394 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5395 "x.__delitem__(y) <==> del x[y]"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5396 SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5397 "x.__contains__(y) <==> y in x"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5398 SQSLOT("__iadd__", sq_inplace_concat, NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5399 wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5400 SQSLOT("__imul__", sq_inplace_repeat, NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5401 wrap_indexargfunc, "x.__imul__(y) <==> x*=y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5402 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5403 MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5404 "x.__len__() <==> len(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5405 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5406 wrap_binaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5407 "x.__getitem__(y) <==> x[y]"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5408 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5409 wrap_objobjargproc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5410 "x.__setitem__(i, y) <==> x[i]=y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5411 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5412 wrap_delitem, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5413 "x.__delitem__(y) <==> del x[y]"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5414 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5415 BINSLOT("__add__", nb_add, slot_nb_add, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5416 "+"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5417 RBINSLOT("__radd__", nb_add, slot_nb_add, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5418 "+"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5419 BINSLOT("__sub__", nb_subtract, slot_nb_subtract, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5420 "-"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5421 RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5422 "-"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5423 BINSLOT("__mul__", nb_multiply, slot_nb_multiply, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5424 "*"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5425 RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5426 "*"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5427 BINSLOT("__mod__", nb_remainder, slot_nb_remainder, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5428 "%"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5429 RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5430 "%"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5431 BINSLOTNOTINFIX("__divmod__", nb_divmod, slot_nb_divmod, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5432 "divmod(x, y)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5433 RBINSLOTNOTINFIX("__rdivmod__", nb_divmod, slot_nb_divmod, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5434 "divmod(y, x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5435 NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5436 "x.__pow__(y[, z]) <==> pow(x, y[, z])"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5437 NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5438 "y.__rpow__(x[, z]) <==> pow(x, y[, z])"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5439 UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-x"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5440 UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5441 UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5442 "abs(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5443 UNSLOT("__bool__", nb_bool, slot_nb_bool, wrap_inquirypred, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5444 "x != 0"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5445 UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5446 BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5447 RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5448 BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5449 RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5450 BINSLOT("__and__", nb_and, slot_nb_and, "&"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5451 RBINSLOT("__rand__", nb_and, slot_nb_and, "&"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5452 BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5453 RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5454 BINSLOT("__or__", nb_or, slot_nb_or, "|"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5455 RBINSLOT("__ror__", nb_or, slot_nb_or, "|"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5456 UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5457 "int(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5458 UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5459 "float(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5460 NBSLOT("__index__", nb_index, slot_nb_index, wrap_unaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5461 "x[y:z] <==> x[y.__index__():z.__index__()]"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5462 IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5463 wrap_binaryfunc, "+"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5464 IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5465 wrap_binaryfunc, "-"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5466 IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5467 wrap_binaryfunc, "*"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5468 IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5469 wrap_binaryfunc, "%"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5470 IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5471 wrap_binaryfunc, "**"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5472 IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5473 wrap_binaryfunc, "<<"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5474 IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5475 wrap_binaryfunc, ">>"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5476 IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5477 wrap_binaryfunc, "&"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5478 IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5479 wrap_binaryfunc, "^"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5480 IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5481 wrap_binaryfunc, "|"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5482 BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5483 RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5484 BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5485 RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5486 IBSLOT("__ifloordiv__", nb_inplace_floor_divide, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5487 slot_nb_inplace_floor_divide, wrap_binaryfunc, "//"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5488 IBSLOT("__itruediv__", nb_inplace_true_divide, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5489 slot_nb_inplace_true_divide, wrap_binaryfunc, "/"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5490 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5491 TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5492 "x.__str__() <==> str(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5493 TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5494 "x.__repr__() <==> repr(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5495 TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5496 "x.__hash__() <==> hash(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5497 FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5498 "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5499 TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5500 wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5501 TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5502 TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5503 TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5504 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5505 "x.__setattr__('name', value) <==> x.name = value"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5506 TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5507 TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5508 "x.__delattr__('name') <==> del x.name"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5509 TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5510 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5511 "x.__lt__(y) <==> x<y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5512 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5513 "x.__le__(y) <==> x<=y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5514 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5515 "x.__eq__(y) <==> x==y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5516 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5517 "x.__ne__(y) <==> x!=y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5518 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5519 "x.__gt__(y) <==> x>y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5520 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5521 "x.__ge__(y) <==> x>=y"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5522 TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5523 "x.__iter__() <==> iter(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5524 TPSLOT("__next__", tp_iternext, slot_tp_iternext, wrap_next, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5525 "x.__next__() <==> next(x)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5526 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5527 "descr.__get__(obj[, type]) -> value"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5528 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5529 "descr.__set__(obj, value)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5530 TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5531 wrap_descr_delete, "descr.__delete__(obj)"), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5532 FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5533 "x.__init__(...) initializes x; " |
|
64077
4085cc560e9e
Merged revisions 84106 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
61467
diff
changeset
|
5534 "see help(type(x)) for signature", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5535 PyWrapperFlag_KEYWORDS), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5536 TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5537 TPSLOT("__del__", tp_del, slot_tp_del, NULL, ""), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5538 {NULL} |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5539 }; |
|
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5540 |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5541 /* Given a type pointer and an offset gotten from a slotdef entry, return a |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5542 pointer to the actual slot. This is not quite the same as simply adding |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5543 the offset to the type pointer, since it takes care to indirect through the |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5544 proper indirection pointer (as_buffer, etc.); it returns NULL if the |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5545 indirection pointer is NULL. */ |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5546 static void ** |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36169
diff
changeset
|
5547 slotptr(PyTypeObject *type, int ioffset) |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5548 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5549 char *ptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5550 long offset = ioffset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5551 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5552 /* Note: this depends on the order of the members of PyHeapTypeObject! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5553 assert(offset >= 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5554 assert((size_t)offset < offsetof(PyHeapTypeObject, as_buffer)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5555 if ((size_t)offset >= offsetof(PyHeapTypeObject, as_sequence)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5556 ptr = (char *)type->tp_as_sequence; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5557 offset -= offsetof(PyHeapTypeObject, as_sequence); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5558 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5559 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_mapping)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5560 ptr = (char *)type->tp_as_mapping; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5561 offset -= offsetof(PyHeapTypeObject, as_mapping); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5562 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5563 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_number)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5564 ptr = (char *)type->tp_as_number; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5565 offset -= offsetof(PyHeapTypeObject, as_number); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5566 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5567 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5568 ptr = (char *)type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5569 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5570 if (ptr != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5571 ptr += offset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5572 return (void **)ptr; |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5573 } |
| 19036 | 5574 |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5575 /* Length of array of slotdef pointers used to store slots with the |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5576 same __name__. There should be at most MAX_EQUIV-1 slotdef entries with |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5577 the same __name__, for any __name__. Since that's a static property, it is |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5578 appropriate to declare fixed-size arrays for this. */ |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5579 #define MAX_EQUIV 10 |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5580 |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5581 /* Return a slot pointer for a given name, but ONLY if the attribute has |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5582 exactly one slot function. The name must be an interned string. */ |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5583 static void ** |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5584 resolve_slotdups(PyTypeObject *type, PyObject *name) |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5585 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5586 /* XXX Maybe this could be optimized more -- but is it worth it? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5587 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5588 /* pname and ptrs act as a little cache */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5589 static PyObject *pname; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5590 static slotdef *ptrs[MAX_EQUIV]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5591 slotdef *p, **pp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5592 void **res, **ptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5593 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5594 if (pname != name) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5595 /* Collect all slotdefs that match name into ptrs. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5596 pname = name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5597 pp = ptrs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5598 for (p = slotdefs; p->name_strobj; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5599 if (p->name_strobj == name) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5600 *pp++ = p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5601 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5602 *pp = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5603 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5604 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5605 /* Look in all matching slots of the type; if exactly one of these has |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5606 a filled-in slot, return its value. Otherwise return NULL. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5607 res = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5608 for (pp = ptrs; *pp; pp++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5609 ptr = slotptr(type, (*pp)->offset); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5610 if (ptr == NULL || *ptr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5611 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5612 if (res != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5613 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5614 res = ptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5615 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5616 return res; |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5617 } |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5618 |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5619 /* Common code for update_slots_callback() and fixup_slot_dispatchers(). This |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5620 does some incredibly complex thinking and then sticks something into the |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5621 slot. (It sees if the adjacent slotdefs for the same slot have conflicting |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5622 interests, and then stores a generic wrapper or a specific function into |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5623 the slot.) Return a pointer to the next slotdef with a different offset, |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5624 because that's convenient for fixup_slot_dispatchers(). */ |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5625 static slotdef * |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5626 update_one_slot(PyTypeObject *type, slotdef *p) |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5627 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5628 PyObject *descr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5629 PyWrapperDescrObject *d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5630 void *generic = NULL, *specific = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5631 int use_generic = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5632 int offset = p->offset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5633 void **ptr = slotptr(type, offset); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5634 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5635 if (ptr == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5636 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5637 ++p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5638 } while (p->offset == offset); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5639 return p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5640 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5641 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5642 descr = _PyType_Lookup(type, p->name_strobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5643 if (descr == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5644 if (ptr == (void**)&type->tp_iternext) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5645 specific = _PyObject_NextNotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5646 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5647 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5648 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5649 if (Py_TYPE(descr) == &PyWrapperDescr_Type) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5650 void **tptr = resolve_slotdups(type, p->name_strobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5651 if (tptr == NULL || tptr == ptr) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5652 generic = p->function; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5653 d = (PyWrapperDescrObject *)descr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5654 if (d->d_base->wrapper == p->wrapper && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5655 PyType_IsSubtype(type, d->d_type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5656 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5657 if (specific == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5658 specific == d->d_wrapped) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5659 specific = d->d_wrapped; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5660 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5661 use_generic = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5662 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5663 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5664 else if (Py_TYPE(descr) == &PyCFunction_Type && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5665 PyCFunction_GET_FUNCTION(descr) == |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5666 (PyCFunction)tp_new_wrapper && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5667 ptr == (void**)&type->tp_new) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5668 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5669 /* The __new__ wrapper is not a wrapper descriptor, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5670 so must be special-cased differently. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5671 If we don't do this, creating an instance will |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5672 always use slot_tp_new which will look up |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5673 __new__ in the MRO which will call tp_new_wrapper |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5674 which will look through the base classes looking |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5675 for a static base and call its tp_new (usually |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5676 PyType_GenericNew), after performing various |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5677 sanity checks and constructing a new argument |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5678 list. Cut all that nonsense short -- this speeds |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5679 up instance creation tremendously. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5680 specific = (void *)type->tp_new; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5681 /* XXX I'm not 100% sure that there isn't a hole |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5682 in this reasoning that requires additional |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5683 sanity checks. I'll buy the first person to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5684 point out a bug in this reasoning a beer. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5685 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5686 else if (descr == Py_None && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5687 ptr == (void**)&type->tp_hash) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5688 /* We specifically allow __hash__ to be set to None |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5689 to prevent inheritance of the default |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5690 implementation from object.__hash__ */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5691 specific = PyObject_HashNotImplemented; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5692 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5693 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5694 use_generic = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5695 generic = p->function; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5696 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5697 } while ((++p)->offset == offset); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5698 if (specific && !use_generic) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5699 *ptr = specific; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5700 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5701 *ptr = generic; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5702 return p; |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5703 } |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5704 |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5705 /* In the type, update the slots whose slotdefs are gathered in the pp array. |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5706 This is a callback for update_subclasses(). */ |
|
20382
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5707 static int |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5708 update_slots_callback(PyTypeObject *type, void *data) |
|
20382
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5709 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5710 slotdef **pp = (slotdef **)data; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5711 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5712 for (; *pp; pp++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5713 update_one_slot(type, *pp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5714 return 0; |
|
20382
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5715 } |
|
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5716 |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5717 /* Comparison function for qsort() to compare slotdefs by their offset, and |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5718 for equal offset by their address (to force a stable sort). */ |
|
20423
4698a3ec5fa8
Redid the slot computation. The initial slot assignments are now done
Guido van Rossum <guido@python.org>
parents:
20386
diff
changeset
|
5719 static int |
|
4698a3ec5fa8
Redid the slot computation. The initial slot assignments are now done
Guido van Rossum <guido@python.org>
parents:
20386
diff
changeset
|
5720 slotdef_cmp(const void *aa, const void *bb) |
|
4698a3ec5fa8
Redid the slot computation. The initial slot assignments are now done
Guido van Rossum <guido@python.org>
parents:
20386
diff
changeset
|
5721 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5722 const slotdef *a = (const slotdef *)aa, *b = (const slotdef *)bb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5723 int c = a->offset - b->offset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5724 if (c != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5725 return c; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5726 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5727 /* Cannot use a-b, as this gives off_t, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5728 which may lose precision when converted to int. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5729 return (a > b) ? 1 : (a < b) ? -1 : 0; |
|
20423
4698a3ec5fa8
Redid the slot computation. The initial slot assignments are now done
Guido van Rossum <guido@python.org>
parents:
20386
diff
changeset
|
5730 } |
|
4698a3ec5fa8
Redid the slot computation. The initial slot assignments are now done
Guido van Rossum <guido@python.org>
parents:
20386
diff
changeset
|
5731 |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5732 /* Initialize the slotdefs table by adding interned string objects for the |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5733 names and sorting the entries. */ |
|
20382
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5734 static void |
|
20423
4698a3ec5fa8
Redid the slot computation. The initial slot assignments are now done
Guido van Rossum <guido@python.org>
parents:
20386
diff
changeset
|
5735 init_slotdefs(void) |
|
20382
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5736 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5737 slotdef *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5738 static int initialized = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5739 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5740 if (initialized) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5741 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5742 for (p = slotdefs; p->name; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5743 p->name_strobj = PyUnicode_InternFromString(p->name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5744 if (!p->name_strobj) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5745 Py_FatalError("Out of memory interning slotdef names"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5746 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5747 qsort((void *)slotdefs, (size_t)(p-slotdefs), sizeof(slotdef), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5748 slotdef_cmp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5749 initialized = 1; |
|
20382
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5750 } |
|
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5751 |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5752 /* Update the slots after assignment to a class (type) attribute. */ |
|
20382
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5753 static int |
|
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5754 update_slot(PyTypeObject *type, PyObject *name) |
|
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5755 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5756 slotdef *ptrs[MAX_EQUIV]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5757 slotdef *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5758 slotdef **pp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5759 int offset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5760 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5761 /* Clear the VALID_VERSION flag of 'type' and all its |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5762 subclasses. This could possibly be unified with the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5763 update_subclasses() recursion below, but carefully: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5764 they each have their own conditions on which to stop |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5765 recursing into subclasses. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5766 PyType_Modified(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5767 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5768 init_slotdefs(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5769 pp = ptrs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5770 for (p = slotdefs; p->name; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5771 /* XXX assume name is interned! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5772 if (p->name_strobj == name) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5773 *pp++ = p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5774 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5775 *pp = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5776 for (pp = ptrs; *pp; pp++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5777 p = *pp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5778 offset = p->offset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5779 while (p > slotdefs && (p-1)->offset == offset) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5780 --p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5781 *pp = p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5782 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5783 if (ptrs[0] == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5784 return 0; /* Not an attribute that affects any slots */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5785 return update_subclasses(type, name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5786 update_slots_callback, (void *)ptrs); |
|
20382
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5787 } |
|
be08734b0afd
Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents:
20345
diff
changeset
|
5788 |
|
22834
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5789 /* Store the proper functions in the slot dispatches at class (type) |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5790 definition time, based upon which operations the class overrides in its |
|
0908729e94e0
A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents:
22804
diff
changeset
|
5791 dict. */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5792 static void |
|
20343
7bd12270dc3e
Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents:
20328
diff
changeset
|
5793 fixup_slot_dispatchers(PyTypeObject *type) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5794 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5795 slotdef *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5796 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5797 init_slotdefs(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5798 for (p = slotdefs; p->name; ) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5799 p = update_one_slot(type, p); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18068
diff
changeset
|
5800 } |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5801 |
| 26421 | 5802 static void |
| 5803 update_all_slots(PyTypeObject* type) | |
| 5804 { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5805 slotdef *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5806 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5807 init_slotdefs(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5808 for (p = slotdefs; p->name; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5809 /* update_slot returns int but can't actually fail */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5810 update_slot(type, p->name_strobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5811 } |
| 26421 | 5812 } |
| 5813 | |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5814 /* recurse_down_subclasses() and update_subclasses() are mutually |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5815 recursive functions to call a callback for all subclasses, |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5816 but refraining from recursing into subclasses that define 'name'. */ |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5817 |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5818 static int |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5819 update_subclasses(PyTypeObject *type, PyObject *name, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5820 update_callback callback, void *data) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5821 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5822 if (callback(type, data) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5823 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5824 return recurse_down_subclasses(type, name, callback, data); |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5825 } |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5826 |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5827 static int |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5828 recurse_down_subclasses(PyTypeObject *type, PyObject *name, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5829 update_callback callback, void *data) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5830 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5831 PyTypeObject *subclass; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5832 PyObject *ref, *subclasses, *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5833 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5834 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5835 subclasses = type->tp_subclasses; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5836 if (subclasses == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5837 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5838 assert(PyList_Check(subclasses)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5839 n = PyList_GET_SIZE(subclasses); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5840 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5841 ref = PyList_GET_ITEM(subclasses, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5842 assert(PyWeakref_CheckRef(ref)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5843 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5844 assert(subclass != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5845 if ((PyObject *)subclass == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5846 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5847 assert(PyType_Check(subclass)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5848 /* Avoid recursing down into unaffected classes */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5849 dict = subclass->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5850 if (dict != NULL && PyDict_Check(dict) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5851 PyDict_GetItem(dict, name) != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5852 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5853 if (update_subclasses(subclass, name, callback, data) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5854 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5855 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5856 return 0; |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5857 } |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5858 |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5859 /* This function is called by PyType_Ready() to populate the type's |
|
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5860 dictionary with method descriptors for function slots. For each |
|
23830
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5861 function slot (like tp_repr) that's defined in the type, one or more |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5862 corresponding descriptors are added in the type's tp_dict dictionary |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5863 under the appropriate name (like __repr__). Some function slots |
|
23830
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5864 cause more than one descriptor to be added (for example, the nb_add |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5865 slot adds both __add__ and __radd__ descriptors) and some function |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5866 slots compete for the same descriptor (for example both sq_item and |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5867 mp_subscript generate a __getitem__ descriptor). |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5868 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5869 In the latter case, the first slotdef entry encoutered wins. Since |
|
28390
33319458fe99
slot_sq_contains(): This leaked a reference to the result of calling
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
5870 slotdef entries are sorted by the offset of the slot in the |
|
28219
7c8e8807aed2
- The extended type structure used for heap types (new-style
Guido van Rossum <guido@python.org>
parents:
28016
diff
changeset
|
5871 PyHeapTypeObject, this gives us some control over disambiguating |
|
28403
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5872 between competing slots: the members of PyHeapTypeObject are listed |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5873 from most general to least general, so the most general slot is |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5874 preferred. In particular, because as_mapping comes before as_sequence, |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5875 for a type that defines both mp_subscript and sq_item, mp_subscript |
|
63ed85290413
Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents:
28396
diff
changeset
|
5876 wins. |
|
23830
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5877 |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5878 This only adds new descriptors and doesn't overwrite entries in |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5879 tp_dict that were previously defined. The descriptors contain a |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5880 reference to the C function they must call, so that it's safe if they |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5881 are copied into a subtype's __dict__ and the subtype has a different |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5882 C function in its slot -- calling the method defined by the |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5883 descriptor will call the C function that was used to create it, |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5884 rather than the C function present in the slot when it is called. |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5885 (This is important because a subtype may have a C function in the |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5886 slot that calls the method from the dictionary, and we want to avoid |
|
ade1d56109a8
Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents:
23756
diff
changeset
|
5887 infinite recursion here.) */ |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5888 |
|
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5889 static int |
|
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5890 add_operators(PyTypeObject *type) |
|
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5891 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5892 PyObject *dict = type->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5893 slotdef *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5894 PyObject *descr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5895 void **ptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5896 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5897 init_slotdefs(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5898 for (p = slotdefs; p->name; p++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5899 if (p->wrapper == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5900 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5901 ptr = slotptr(type, p->offset); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5902 if (!ptr || !*ptr) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5903 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5904 if (PyDict_GetItem(dict, p->name_strobj)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5905 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5906 if (*ptr == PyObject_HashNotImplemented) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5907 /* Classes may prevent the inheritance of the tp_hash |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5908 slot by storing PyObject_HashNotImplemented in it. Make it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5909 visible as a None value for the __hash__ attribute. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5910 if (PyDict_SetItem(dict, p->name_strobj, Py_None) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5911 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5912 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5913 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5914 descr = PyDescr_NewWrapper(type, p, *ptr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5915 if (descr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5916 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5917 if (PyDict_SetItem(dict, p->name_strobj, descr) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5918 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5919 Py_DECREF(descr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5920 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5921 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5922 if (type->tp_new != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5923 if (add_tp_new_wrapper(type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5924 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5925 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5926 return 0; |
|
20586
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5927 } |
|
9bd603d434f5
Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents:
20516
diff
changeset
|
5928 |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5929 |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5930 /* Cooperative 'super' */ |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5931 |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5932 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5933 PyObject_HEAD |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5934 PyTypeObject *type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5935 PyObject *obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5936 PyTypeObject *obj_type; |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5937 } superobject; |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5938 |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19970
diff
changeset
|
5939 static PyMemberDef super_members[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5940 {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5941 "the class invoking super()"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5942 {"__self__", T_OBJECT, offsetof(superobject, obj), READONLY, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5943 "the instance invoking super(); may be None"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5944 {"__self_class__", T_OBJECT, offsetof(superobject, obj_type), READONLY, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5945 "the type of the instance invoking super(); may be None"}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5946 {0} |
|
19630
ae056f114974
Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents:
19618
diff
changeset
|
5947 }; |
|
ae056f114974
Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents:
19618
diff
changeset
|
5948 |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5949 static void |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5950 super_dealloc(PyObject *self) |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5951 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5952 superobject *su = (superobject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5953 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5954 _PyObject_GC_UNTRACK(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5955 Py_XDECREF(su->obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5956 Py_XDECREF(su->type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5957 Py_XDECREF(su->obj_type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5958 Py_TYPE(self)->tp_free(self); |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5959 } |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5960 |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5961 static PyObject * |
|
19630
ae056f114974
Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents:
19618
diff
changeset
|
5962 super_repr(PyObject *self) |
|
ae056f114974
Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents:
19618
diff
changeset
|
5963 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5964 superobject *su = (superobject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5965 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5966 if (su->obj_type) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5967 return PyUnicode_FromFormat( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5968 "<super: <class '%s'>, <%s object>>", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5969 su->type ? su->type->tp_name : "NULL", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5970 su->obj_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5971 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5972 return PyUnicode_FromFormat( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5973 "<super: <class '%s'>, NULL>", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5974 su->type ? su->type->tp_name : "NULL"); |
|
19630
ae056f114974
Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents:
19618
diff
changeset
|
5975 } |
|
ae056f114974
Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents:
19618
diff
changeset
|
5976 |
|
ae056f114974
Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents:
19618
diff
changeset
|
5977 static PyObject * |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5978 super_getattro(PyObject *self, PyObject *name) |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
5979 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5980 superobject *su = (superobject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5981 int skip = su->obj_type == NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5982 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5983 if (!skip) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5984 /* We want __class__ to return the class of the super object |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5985 (i.e. super, or a subclass), not the class of su->obj. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5986 skip = (PyUnicode_Check(name) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5987 PyUnicode_GET_SIZE(name) == 9 && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5988 PyUnicode_CompareWithASCIIString(name, "__class__") == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5989 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5990 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5991 if (!skip) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5992 PyObject *mro, *res, *tmp, *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5993 PyTypeObject *starttype; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5994 descrgetfunc f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5995 Py_ssize_t i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5996 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5997 starttype = su->obj_type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5998 mro = starttype->tp_mro; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
5999 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6000 if (mro == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6001 n = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6002 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6003 assert(PyTuple_Check(mro)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6004 n = PyTuple_GET_SIZE(mro); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6005 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6006 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6007 if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6008 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6009 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6010 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6011 res = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6012 for (; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6013 tmp = PyTuple_GET_ITEM(mro, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6014 if (PyType_Check(tmp)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6015 dict = ((PyTypeObject *)tmp)->tp_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6016 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6017 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6018 res = PyDict_GetItem(dict, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6019 if (res != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6020 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6021 f = Py_TYPE(res)->tp_descr_get; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6022 if (f != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6023 tmp = f(res, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6024 /* Only pass 'obj' param if |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6025 this is instance-mode super |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6026 (See SF ID #743627) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6027 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6028 (su->obj == (PyObject *) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6029 su->obj_type |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6030 ? (PyObject *)NULL |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6031 : su->obj), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6032 (PyObject *)starttype); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6033 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6034 res = tmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6035 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6036 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6037 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6038 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6039 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6040 return PyObject_GenericGetAttr(self, name); |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6041 } |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6042 |
|
27831
6b5696541ba4
Implement another useful feature for proxies: in super(X, x), x may
Guido van Rossum <guido@python.org>
parents:
27821
diff
changeset
|
6043 static PyTypeObject * |
|
21151
918b57354d87
Address SF patch #480716 as well as related issues.
Guido van Rossum <guido@python.org>
parents:
21142
diff
changeset
|
6044 supercheck(PyTypeObject *type, PyObject *obj) |
|
918b57354d87
Address SF patch #480716 as well as related issues.
Guido van Rossum <guido@python.org>
parents:
21142
diff
changeset
|
6045 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6046 /* Check that a super() call makes sense. Return a type object. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6047 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6048 obj can be a new-style class, or an instance of one: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6049 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6050 - If it is a class, it must be a subclass of 'type'. This case is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6051 used for class methods; the return value is obj. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6052 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6053 - If it is an instance, it must be an instance of 'type'. This is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6054 the normal case; the return value is obj.__class__. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6055 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6056 But... when obj is an instance, we want to allow for the case where |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6057 Py_TYPE(obj) is not a subclass of type, but obj.__class__ is! |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6058 This will allow using super() with a proxy for obj. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6059 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6060 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6061 /* Check for first bullet above (special case) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6062 if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, type)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6063 Py_INCREF(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6064 return (PyTypeObject *)obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6065 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6066 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6067 /* Normal case */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6068 if (PyType_IsSubtype(Py_TYPE(obj), type)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6069 Py_INCREF(Py_TYPE(obj)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6070 return Py_TYPE(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6071 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6072 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6073 /* Try the slow way */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6074 static PyObject *class_str = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6075 PyObject *class_attr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6076 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6077 if (class_str == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6078 class_str = PyUnicode_FromString("__class__"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6079 if (class_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6080 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6081 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6082 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6083 class_attr = PyObject_GetAttr(obj, class_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6084 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6085 if (class_attr != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6086 PyType_Check(class_attr) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6087 (PyTypeObject *)class_attr != Py_TYPE(obj)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6088 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6089 int ok = PyType_IsSubtype( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6090 (PyTypeObject *)class_attr, type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6091 if (ok) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6092 return (PyTypeObject *)class_attr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6093 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6094 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6095 if (class_attr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6096 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6097 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6098 Py_DECREF(class_attr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6099 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6100 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6101 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6102 "super(type, obj): " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6103 "obj must be an instance or subtype of type"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6104 return NULL; |
|
21151
918b57354d87
Address SF patch #480716 as well as related issues.
Guido van Rossum <guido@python.org>
parents:
21142
diff
changeset
|
6105 } |
|
918b57354d87
Address SF patch #480716 as well as related issues.
Guido van Rossum <guido@python.org>
parents:
21142
diff
changeset
|
6106 |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6107 static PyObject * |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6108 super_descr_get(PyObject *self, PyObject *obj, PyObject *type) |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6109 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6110 superobject *su = (superobject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6111 superobject *newobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6112 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6113 if (obj == NULL || obj == Py_None || su->obj != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6114 /* Not binding to an object, or already bound */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6115 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6116 return self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6117 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6118 if (Py_TYPE(su) != &PySuper_Type) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6119 /* If su is an instance of a (strict) subclass of super, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6120 call its type */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6121 return PyObject_CallFunctionObjArgs((PyObject *)Py_TYPE(su), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6122 su->type, obj, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6123 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6124 /* Inline the common case */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6125 PyTypeObject *obj_type = supercheck(su->type, obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6126 if (obj_type == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6127 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6128 newobj = (superobject *)PySuper_Type.tp_new(&PySuper_Type, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6129 NULL, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6130 if (newobj == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6131 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6132 Py_INCREF(su->type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6133 Py_INCREF(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6134 newobj->type = su->type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6135 newobj->obj = obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6136 newobj->obj_type = obj_type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6137 return (PyObject *)newobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6138 } |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6139 } |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6140 |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6141 static int |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6142 super_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6143 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6144 superobject *su = (superobject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6145 PyTypeObject *type = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6146 PyObject *obj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6147 PyTypeObject *obj_type = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6148 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6149 if (!_PyArg_NoKeywords("super", kwds)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6150 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6151 if (!PyArg_ParseTuple(args, "|O!O:super", &PyType_Type, &type, &obj)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6152 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6153 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6154 if (type == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6155 /* Call super(), without args -- fill in from __class__ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6156 and first local variable on the stack. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6157 PyFrameObject *f = PyThreadState_GET()->frame; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6158 PyCodeObject *co = f->f_code; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6159 int i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6160 if (co == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6161 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6162 "super(): no code object"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6163 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6164 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6165 if (co->co_argcount == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6166 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6167 "super(): no arguments"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6168 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6169 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6170 obj = f->f_localsplus[0]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6171 if (obj == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6172 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6173 "super(): arg[0] deleted"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6174 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6175 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6176 if (co->co_freevars == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6177 n = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6178 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6179 assert(PyTuple_Check(co->co_freevars)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6180 n = PyTuple_GET_SIZE(co->co_freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6181 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6182 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6183 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6184 assert(PyUnicode_Check(name)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6185 if (!PyUnicode_CompareWithASCIIString(name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6186 "__class__")) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6187 Py_ssize_t index = co->co_nlocals + |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6188 PyTuple_GET_SIZE(co->co_cellvars) + i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6189 PyObject *cell = f->f_localsplus[index]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6190 if (cell == NULL || !PyCell_Check(cell)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6191 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6192 "super(): bad __class__ cell"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6193 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6194 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6195 type = (PyTypeObject *) PyCell_GET(cell); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6196 if (type == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6197 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6198 "super(): empty __class__ cell"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6199 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6200 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6201 if (!PyType_Check(type)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6202 PyErr_Format(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6203 "super(): __class__ is not a type (%s)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6204 Py_TYPE(type)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6205 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6206 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6207 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6208 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6209 } |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42081
diff
changeset
|
6210 if (type == NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6211 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6212 "super(): __class__ cell not found"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6213 return -1; |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42081
diff
changeset
|
6214 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6215 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6216 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6217 if (obj == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6218 obj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6219 if (obj != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6220 obj_type = supercheck(type, obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6221 if (obj_type == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6222 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6223 Py_INCREF(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6224 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6225 Py_INCREF(type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6226 su->type = type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6227 su->obj = obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6228 su->obj_type = obj_type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6229 return 0; |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6230 } |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6231 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23830
diff
changeset
|
6232 PyDoc_STRVAR(super_doc, |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42081
diff
changeset
|
6233 "super() -> same as super(__class__, <first argument>)\n" |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6234 "super(type) -> unbound super object\n" |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6235 "super(type, obj) -> bound super object; requires isinstance(obj, type)\n" |
|
19551
01a6901cd305
Fix super() so that it is usable for static methods (like __new__) as well.
Guido van Rossum <guido@python.org>
parents:
19540
diff
changeset
|
6236 "super(type, type2) -> bound super object; requires issubclass(type2, type)\n" |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6237 "Typical use to call a cooperative superclass method:\n" |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6238 "class C(B):\n" |
|
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6239 " def meth(self, arg):\n" |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6240 " super().meth(arg)\n" |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42081
diff
changeset
|
6241 "This works for class methods too:\n" |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42081
diff
changeset
|
6242 "class C(B):\n" |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42081
diff
changeset
|
6243 " @classmethod\n" |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42081
diff
changeset
|
6244 " def cmeth(cls, arg):\n" |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6245 " super().cmeth(arg)\n"); |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6246 |
|
20220
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
6247 static int |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
6248 super_traverse(PyObject *self, visitproc visit, void *arg) |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
6249 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6250 superobject *su = (superobject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6251 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6252 Py_VISIT(su->obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6253 Py_VISIT(su->type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6254 Py_VISIT(su->obj_type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6255 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6256 return 0; |
|
20220
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
6257 } |
|
0b99174d6b17
Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents:
20204
diff
changeset
|
6258 |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6259 PyTypeObject PySuper_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6260 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6261 "super", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6262 sizeof(superobject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6263 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6264 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6265 super_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6266 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6267 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6268 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6269 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6270 super_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6271 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6272 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6273 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6274 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6275 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6276 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6277 super_getattro, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6278 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6279 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6280 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6281 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6282 super_doc, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6283 super_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6284 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6285 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6286 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6287 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6288 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6289 0, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6290 super_members, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6291 0, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6292 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6293 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6294 super_descr_get, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6295 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6296 0, /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6297 super_init, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6298 PyType_GenericAlloc, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6299 PyType_GenericNew, /* tp_new */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59858
diff
changeset
|
6300 PyObject_GC_Del, /* tp_free */ |
|
19469
b3c92f013869
Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents:
19464
diff
changeset
|
6301 }; |
