annotate Objects/typeobject.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 1ceb6f84b617
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Type object implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
76485
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
17 #define MCACHE_SIZE_EXP 9
61467
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, \
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71895
diff changeset
23 ((PyASCIIObject *)(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) && \
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71895
diff changeset
26 PyUnicode_READY(name) != -1 && \
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71895
diff changeset
27 PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE
44654
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
28
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
29 struct method_cache_entry {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
30 unsigned int version;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
31 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
32 PyObject *value; /* borrowed */
44654
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
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
35 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
36 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
37
86994
4a09cc62419b Issue #19514: Deduplicate some _Py_IDENTIFIER declarations.
Martin v. Löwis <martin@v.loewis.de>
parents: 86980
diff changeset
38 /* alphabetical order */
4a09cc62419b Issue #19514: Deduplicate some _Py_IDENTIFIER declarations.
Martin v. Löwis <martin@v.loewis.de>
parents: 86980
diff changeset
39 _Py_IDENTIFIER(__abstractmethods__);
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
40 _Py_IDENTIFIER(__class__);
86994
4a09cc62419b Issue #19514: Deduplicate some _Py_IDENTIFIER declarations.
Martin v. Löwis <martin@v.loewis.de>
parents: 86980
diff changeset
41 _Py_IDENTIFIER(__delitem__);
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72913
diff changeset
42 _Py_IDENTIFIER(__dict__);
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
43 _Py_IDENTIFIER(__doc__);
86994
4a09cc62419b Issue #19514: Deduplicate some _Py_IDENTIFIER declarations.
Martin v. Löwis <martin@v.loewis.de>
parents: 86980
diff changeset
44 _Py_IDENTIFIER(__getattribute__);
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
45 _Py_IDENTIFIER(__getitem__);
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
46 _Py_IDENTIFIER(__hash__);
86994
4a09cc62419b Issue #19514: Deduplicate some _Py_IDENTIFIER declarations.
Martin v. Löwis <martin@v.loewis.de>
parents: 86980
diff changeset
47 _Py_IDENTIFIER(__len__);
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
48 _Py_IDENTIFIER(__module__);
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
49 _Py_IDENTIFIER(__name__);
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
50 _Py_IDENTIFIER(__new__);
86994
4a09cc62419b Issue #19514: Deduplicate some _Py_IDENTIFIER declarations.
Martin v. Löwis <martin@v.loewis.de>
parents: 86980
diff changeset
51 _Py_IDENTIFIER(__setitem__);
86999
01c4a0af73cf Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents: 86994
diff changeset
52 _Py_IDENTIFIER(builtins);
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
53
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
54 static PyObject *
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
55 slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
56
45026
ebfbaa1051e2 Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45017
diff changeset
57 unsigned int
ebfbaa1051e2 Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45017
diff changeset
58 PyType_ClearCache(void)
ebfbaa1051e2 Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45017
diff changeset
59 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
60 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
61 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
62
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
63 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
64 method_cache[i].version = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
65 Py_CLEAR(method_cache[i].name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
66 method_cache[i].value = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
67 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
68 next_version_tag = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
69 /* mark all version tags as invalid */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
70 PyType_Modified(&PyBaseObject_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
71 return cur_version_tag;
45026
ebfbaa1051e2 Merged revisions 60364-60378 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45017
diff changeset
72 }
44654
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
73
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
74 void
83612
8c1385205a35 Issue #17408: Avoid using an obsolete instance of the copyreg module when the interpreter is shutdown and then started again.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83284
diff changeset
75 _PyType_Fini(void)
8c1385205a35 Issue #17408: Avoid using an obsolete instance of the copyreg module when the interpreter is shutdown and then started again.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83284
diff changeset
76 {
8c1385205a35 Issue #17408: Avoid using an obsolete instance of the copyreg module when the interpreter is shutdown and then started again.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83284
diff changeset
77 PyType_ClearCache();
8c1385205a35 Issue #17408: Avoid using an obsolete instance of the copyreg module when the interpreter is shutdown and then started again.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83284
diff changeset
78 }
8c1385205a35 Issue #17408: Avoid using an obsolete instance of the copyreg module when the interpreter is shutdown and then started again.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83284
diff changeset
79
8c1385205a35 Issue #17408: Avoid using an obsolete instance of the copyreg module when the interpreter is shutdown and then started again.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83284
diff changeset
80 void
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
81 PyType_Modified(PyTypeObject *type)
44654
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
82 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
83 /* 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
84 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
85 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
86
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
87 Invariants:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
88
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
89 - 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
90 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
91 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
92
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
93 - 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
94 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
95
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
96 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
97 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
98 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
99 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
100 needed.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
101 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
102 PyObject *raw, *ref;
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
103 Py_ssize_t i;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
104
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
105 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
106 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
107
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
108 raw = type->tp_subclasses;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
109 if (raw != NULL) {
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
110 assert(PyDict_CheckExact(raw));
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
111 i = 0;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
112 while (PyDict_Next(raw, &i, NULL, &ref)) {
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
113 assert(PyWeakref_CheckRef(ref));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
114 ref = PyWeakref_GET_OBJECT(ref);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
115 if (ref != Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
116 PyType_Modified((PyTypeObject *)ref);
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
119 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
120 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
121 }
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
122
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
123 static void
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
124 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
125 /*
73949
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
126 Check that all base classes or elements of the MRO of type are
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
127 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
128 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
129
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
130 Unset HAVE_VERSION_TAG and VALID_VERSION_TAG if the type
73949
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
131 has a custom MRO that includes a type which is not officially
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
132 super type.
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
133
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
134 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
135 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
136 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
137 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
138 int clear = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
139
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
140 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
141 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
142
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
143 n = PyTuple_GET_SIZE(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
144 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
145 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
146 PyTypeObject *cls;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
147
73949
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
148 assert(PyType_Check(b));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
149 cls = (PyTypeObject *)b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
150
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
151 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
152 !PyType_IsSubtype(type, cls)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
153 clear = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
154 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
155 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
156 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
157
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
158 if (clear)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
159 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
160 Py_TPFLAGS_VALID_VERSION_TAG);
44654
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
161 }
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
162
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
163 static int
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
164 assign_version_tag(PyTypeObject *type)
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
165 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
166 /* 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
167 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
168 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
169 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
170 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
171 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
172 PyObject *bases;
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 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
175 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
176 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
177 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
178 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
179 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
180
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
181 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
182 /* 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
183
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
184 if (type->tp_version_tag == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
185 /* 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
186 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
187 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
188 are borrowed reference */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
189 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
190 method_cache[i].value = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
191 Py_XDECREF(method_cache[i].name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
192 method_cache[i].name = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
193 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
194 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
195 /* mark all version tags as invalid */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
196 PyType_Modified(&PyBaseObject_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
197 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
198 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
199 bases = type->tp_bases;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
200 n = PyTuple_GET_SIZE(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
201 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
202 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
203 assert(PyType_Check(b));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
204 if (!assign_version_tag((PyTypeObject *)b))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
205 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
206 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
207 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
208 return 1;
44654
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
209 }
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
210
5a71dcc71eff Merged revisions 59921-59932 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44626
diff changeset
211
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19970
diff changeset
212 static PyMemberDef type_members[] = {
64285
190375445241 Merged revisions 84320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64077
diff changeset
213 {"__basicsize__", T_PYSSIZET, offsetof(PyTypeObject,tp_basicsize),READONLY},
190375445241 Merged revisions 84320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64077
diff changeset
214 {"__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
215 {"__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
216 {"__weakrefoffset__", T_LONG,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
217 offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
218 {"__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
219 {"__dictoffset__", T_LONG,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
220 offsetof(PyTypeObject, tp_dictoffset), READONLY},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
221 {"__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
222 {0}
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
223 };
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
71894
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
225 static int
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
226 check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *name)
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
227 {
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
228 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
229 PyErr_Format(PyExc_TypeError,
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
230 "can't set %s.%s", type->tp_name, name);
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
231 return 0;
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
232 }
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
233 if (!value) {
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
234 PyErr_Format(PyExc_TypeError,
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
235 "can't delete %s.%s", type->tp_name, name);
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
236 return 0;
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
237 }
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
238 return 1;
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
239 }
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
240
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
241 static PyObject *
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
242 type_name(PyTypeObject *type, void *context)
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
243 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
244 const char *s;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
245
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
246 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
247 PyHeapTypeObject* et = (PyHeapTypeObject*)type;
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 Py_INCREF(et->ht_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
250 return et->ht_name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
251 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
252 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
253 s = strrchr(type->tp_name, '.');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
254 if (s == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
255 s = type->tp_name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
256 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
257 s++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
258 return PyUnicode_FromString(s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
259 }
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
260 }
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
261
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
262 static PyObject *
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
263 type_qualname(PyTypeObject *type, void *context)
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
264 {
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
265 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
266 PyHeapTypeObject* et = (PyHeapTypeObject*)type;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
267 Py_INCREF(et->ht_qualname);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
268 return et->ht_qualname;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
269 }
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
270 else {
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
271 return type_name(type, context);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
272 }
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
273 }
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
274
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
275 static int
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
276 type_set_name(PyTypeObject *type, PyObject *value, void *context)
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
277 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
278 PyHeapTypeObject* et;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
279 char *tp_name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
280 PyObject *tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
281
71894
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
282 if (!check_set_special_type_attr(type, value, "__name__"))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
283 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
284 if (!PyUnicode_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
285 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
286 "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
287 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
288 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
289 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
290
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
291 /* Check absence of null characters */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
292 tmp = PyUnicode_FromStringAndSize("\0", 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
293 if (tmp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
294 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
295 if (PyUnicode_Contains(value, tmp) != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
296 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
297 PyErr_Format(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
298 "__name__ must not contain null bytes");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
299 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
300 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
301 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
302
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
303 tp_name = _PyUnicode_AsString(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
304 if (tp_name == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
305 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
306
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
307 et = (PyHeapTypeObject*)type;
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 Py_INCREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
310
83284
e6d1328412c8 Issue #16447: Fix potential segfault when setting __name__ on a class.
Mark Dickinson <dickinsm@gmail.com>
parents: 83059
diff changeset
311 /* Wait until et is a sane state before Py_DECREF'ing the old et->ht_name
e6d1328412c8 Issue #16447: Fix potential segfault when setting __name__ on a class.
Mark Dickinson <dickinsm@gmail.com>
parents: 83059
diff changeset
312 value. (Bug #16447.) */
e6d1328412c8 Issue #16447: Fix potential segfault when setting __name__ on a class.
Mark Dickinson <dickinsm@gmail.com>
parents: 83059
diff changeset
313 tmp = et->ht_name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
314 et->ht_name = value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
315
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
316 type->tp_name = tp_name;
83284
e6d1328412c8 Issue #16447: Fix potential segfault when setting __name__ on a class.
Mark Dickinson <dickinsm@gmail.com>
parents: 83059
diff changeset
317 Py_DECREF(tmp);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
318
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
319 return 0;
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
320 }
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
321
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
322 static int
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
323 type_set_qualname(PyTypeObject *type, PyObject *value, void *context)
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
324 {
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
325 PyHeapTypeObject* et;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
326
80078
c21c894eefe1 do safety checks on __qualname__ assignment
Benjamin Peterson <benjamin@python.org>
parents: 80077
diff changeset
327 if (!check_set_special_type_attr(type, value, "__qualname__"))
c21c894eefe1 do safety checks on __qualname__ assignment
Benjamin Peterson <benjamin@python.org>
parents: 80077
diff changeset
328 return -1;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
329 if (!PyUnicode_Check(value)) {
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
330 PyErr_Format(PyExc_TypeError,
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
331 "can only assign string to %s.__qualname__, not '%s'",
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
332 type->tp_name, Py_TYPE(value)->tp_name);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
333 return -1;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
334 }
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
335
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
336 et = (PyHeapTypeObject*)type;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
337 Py_INCREF(value);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
338 Py_DECREF(et->ht_qualname);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
339 et->ht_qualname = value;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
340 return 0;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
341 }
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
342
19300
81440dd326bb Fix SF bug #442501: calculate __module__ properly.
Guido van Rossum <guido@python.org>
parents: 19297
diff changeset
343 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
344 type_module(PyTypeObject *type, void *context)
2080
c21cc7b3ce28 added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
345 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
346 char *s;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
347
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
348 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
86980
77bebcf5c4cf Issue #19512: add _PyUnicode_CompareWithId() function
Victor Stinner <victor.stinner@gmail.com>
parents: 86969
diff changeset
349 PyObject *mod = _PyDict_GetItemId(type->tp_dict, &PyId___module__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
350 if (!mod) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
351 PyErr_Format(PyExc_AttributeError, "__module__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
352 return 0;
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 Py_XINCREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
355 return mod;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
356 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
357 else {
86980
77bebcf5c4cf Issue #19512: add _PyUnicode_CompareWithId() function
Victor Stinner <victor.stinner@gmail.com>
parents: 86969
diff changeset
358 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
359 s = strrchr(type->tp_name, '.');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
360 if (s != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
361 return PyUnicode_FromStringAndSize(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
362 type->tp_name, (Py_ssize_t)(s - type->tp_name));
86999
01c4a0af73cf Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents: 86994
diff changeset
363 name = _PyUnicode_FromId(&PyId_builtins);
86980
77bebcf5c4cf Issue #19512: add _PyUnicode_CompareWithId() function
Victor Stinner <victor.stinner@gmail.com>
parents: 86969
diff changeset
364 Py_XINCREF(name);
77bebcf5c4cf Issue #19512: add _PyUnicode_CompareWithId() function
Victor Stinner <victor.stinner@gmail.com>
parents: 86969
diff changeset
365 return name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
366 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
367 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
368
20084
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
369 static int
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
370 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
371 {
71894
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
372 if (!check_set_special_type_attr(type, value, "__module__"))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
373 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
374
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
375 PyType_Modified(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
376
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
377 return _PyDict_SetItemId(type->tp_dict, &PyId___module__, value);
20084
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
378 }
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
379
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
380 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
381 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
382 {
65066
394e25382a59 Merged revisions 85154,85182 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64916
diff changeset
383 PyObject *mod = NULL;
65069
b9e26b0c4617 Merged revisions 85193 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65066
diff changeset
384 /* 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
385 that. */
65066
394e25382a59 Merged revisions 85154,85182 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64916
diff changeset
386 if (type != &PyType_Type)
86969
862a62e61553 Issue #19512: type_abstractmethods() and type_set_abstractmethods() now use an
Victor Stinner <victor.stinner@gmail.com>
parents: 86758
diff changeset
387 mod = _PyDict_GetItemId(type->tp_dict, &PyId___abstractmethods__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
388 if (!mod) {
86969
862a62e61553 Issue #19512: type_abstractmethods() and type_set_abstractmethods() now use an
Victor Stinner <victor.stinner@gmail.com>
parents: 86758
diff changeset
389 PyObject *message = _PyUnicode_FromId(&PyId___abstractmethods__);
862a62e61553 Issue #19512: type_abstractmethods() and type_set_abstractmethods() now use an
Victor Stinner <victor.stinner@gmail.com>
parents: 86758
diff changeset
390 if (message)
862a62e61553 Issue #19512: type_abstractmethods() and type_set_abstractmethods() now use an
Victor Stinner <victor.stinner@gmail.com>
parents: 86758
diff changeset
391 PyErr_SetObject(PyExc_AttributeError, message);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
392 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
393 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
394 Py_XINCREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
395 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
396 }
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
397
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
398 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
399 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
400 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
401 /* __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
402 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
403 special to update subclasses.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
404 */
78604
56dc7b09f390 Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77628
diff changeset
405 int abstract, res;
67550
2ea1cfdf929b Merged revisions 87952-87954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65069
diff changeset
406 if (value != NULL) {
78604
56dc7b09f390 Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77628
diff changeset
407 abstract = PyObject_IsTrue(value);
56dc7b09f390 Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77628
diff changeset
408 if (abstract < 0)
56dc7b09f390 Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77628
diff changeset
409 return -1;
86969
862a62e61553 Issue #19512: type_abstractmethods() and type_set_abstractmethods() now use an
Victor Stinner <victor.stinner@gmail.com>
parents: 86758
diff changeset
410 res = _PyDict_SetItemId(type->tp_dict, &PyId___abstractmethods__, value);
67550
2ea1cfdf929b Merged revisions 87952-87954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65069
diff changeset
411 }
2ea1cfdf929b Merged revisions 87952-87954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65069
diff changeset
412 else {
78604
56dc7b09f390 Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77628
diff changeset
413 abstract = 0;
86969
862a62e61553 Issue #19512: type_abstractmethods() and type_set_abstractmethods() now use an
Victor Stinner <victor.stinner@gmail.com>
parents: 86758
diff changeset
414 res = _PyDict_DelItemId(type->tp_dict, &PyId___abstractmethods__);
67550
2ea1cfdf929b Merged revisions 87952-87954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65069
diff changeset
415 if (res && PyErr_ExceptionMatches(PyExc_KeyError)) {
86969
862a62e61553 Issue #19512: type_abstractmethods() and type_set_abstractmethods() now use an
Victor Stinner <victor.stinner@gmail.com>
parents: 86758
diff changeset
416 PyObject *message = _PyUnicode_FromId(&PyId___abstractmethods__);
862a62e61553 Issue #19512: type_abstractmethods() and type_set_abstractmethods() now use an
Victor Stinner <victor.stinner@gmail.com>
parents: 86758
diff changeset
417 if (message)
862a62e61553 Issue #19512: type_abstractmethods() and type_set_abstractmethods() now use an
Victor Stinner <victor.stinner@gmail.com>
parents: 86758
diff changeset
418 PyErr_SetObject(PyExc_AttributeError, message);
67550
2ea1cfdf929b Merged revisions 87952-87954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65069
diff changeset
419 return -1;
2ea1cfdf929b Merged revisions 87952-87954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65069
diff changeset
420 }
2ea1cfdf929b Merged revisions 87952-87954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 65069
diff changeset
421 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
422 if (res == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
423 PyType_Modified(type);
78604
56dc7b09f390 Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77628
diff changeset
424 if (abstract)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
425 type->tp_flags |= Py_TPFLAGS_IS_ABSTRACT;
78604
56dc7b09f390 Issue #15604: Update uses of PyObject_IsTrue() to check for and handle errors correctly.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77628
diff changeset
426 else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
427 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
428 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
429 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
430 }
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
431
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
432 static PyObject *
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
433 type_get_bases(PyTypeObject *type, void *context)
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
434 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
435 Py_INCREF(type->tp_bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
436 return type->tp_bases;
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
437 }
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
438
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
439 static PyTypeObject *best_base(PyObject *);
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
440 static int mro_internal(PyTypeObject *);
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
441 static int compatible_for_assignment(PyTypeObject *, PyTypeObject *, char *);
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
442 static int add_subclass(PyTypeObject*, PyTypeObject*);
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
443 static void remove_subclass(PyTypeObject *, PyTypeObject *);
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
444 static void remove_all_subclasses(PyTypeObject *type, PyObject *bases);
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
445 static void update_all_slots(PyTypeObject *);
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
446
28403
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
447 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
448 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
449 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
450 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
451 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
452
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
453 static int
26445
7421367274b4 Readjustments to the way we cope with exceptions from subclasses'
Michael W. Hudson <mwh@python.net>
parents: 26440
diff changeset
454 mro_subclasses(PyTypeObject *type, PyObject* temp)
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
455 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
456 PyTypeObject *subclass;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
457 PyObject *ref, *subclasses, *old_mro;
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
458 Py_ssize_t i;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
459
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
460 subclasses = type->tp_subclasses;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
461 if (subclasses == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
462 return 0;
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
463 assert(PyDict_CheckExact(subclasses));
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
464 i = 0;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
465
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
466 while (PyDict_Next(subclasses, &i, NULL, &ref)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
467 assert(PyWeakref_CheckRef(ref));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
468 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
469 assert(subclass != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
470 if ((PyObject *)subclass == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
471 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
472 assert(PyType_Check(subclass));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
473 old_mro = subclass->tp_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
474 if (mro_internal(subclass) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
475 subclass->tp_mro = old_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
476 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
477 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
478 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
479 PyObject* tuple;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
480 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
481 Py_DECREF(old_mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
482 if (!tuple)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
483 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
484 if (PyList_Append(temp, tuple) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
485 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
486 Py_DECREF(tuple);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
487 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
488 if (mro_subclasses(subclass, temp) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
489 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
490 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
491 return 0;
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
492 }
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
493
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
494 static int
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
495 type_set_bases(PyTypeObject *type, PyObject *value, void *context)
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
496 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
497 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
498 int r = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
499 PyObject *ob, *temp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
500 PyTypeObject *new_base, *old_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
501 PyObject *old_bases, *old_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
502
71894
7fee7f9d2c03 factor out common checks for setting special type attributes
Benjamin Peterson <benjamin@python.org>
parents: 71892
diff changeset
503 if (!check_set_special_type_attr(type, value, "__bases__"))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
504 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
505 if (!PyTuple_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
506 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
507 "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
508 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
509 return -1;
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 if (PyTuple_GET_SIZE(value) == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
512 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
513 "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
514 type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
515 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
516 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
517 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
518 ob = PyTuple_GET_ITEM(value, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
519 if (!PyType_Check(ob)) {
76059
d746ffc34e0f adjust formatting
Benjamin Peterson <benjamin@python.org>
parents: 76058
diff changeset
520 PyErr_Format(PyExc_TypeError,
76060
1c80a7bcbd6b merge 3.2
Benjamin Peterson <benjamin@python.org>
parents: 75959 76059
diff changeset
521 "%s.__bases__ must be tuple of classes, not '%s'",
76059
d746ffc34e0f adjust formatting
Benjamin Peterson <benjamin@python.org>
parents: 76058
diff changeset
522 type->tp_name, Py_TYPE(ob)->tp_name);
d746ffc34e0f adjust formatting
Benjamin Peterson <benjamin@python.org>
parents: 76058
diff changeset
523 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
524 }
76058
c1fff85711a6 remove extraneous condition
Benjamin Peterson <benjamin@python.org>
parents: 76056
diff changeset
525 if (PyType_IsSubtype((PyTypeObject*)ob, type)) {
c1fff85711a6 remove extraneous condition
Benjamin Peterson <benjamin@python.org>
parents: 76056
diff changeset
526 PyErr_SetString(PyExc_TypeError,
c1fff85711a6 remove extraneous condition
Benjamin Peterson <benjamin@python.org>
parents: 76056
diff changeset
527 "a __bases__ item causes an inheritance cycle");
c1fff85711a6 remove extraneous condition
Benjamin Peterson <benjamin@python.org>
parents: 76056
diff changeset
528 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
529 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
530 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
531
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
532 new_base = best_base(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
533
76056
5bb0acb69921 be consistent with rest of function
Benjamin Peterson <benjamin@python.org>
parents: 75737
diff changeset
534 if (!new_base)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
535 return -1;
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 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
538 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
539
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
540 Py_INCREF(new_base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
541 Py_INCREF(value);
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 old_bases = type->tp_bases;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
544 old_base = type->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
545 old_mro = type->tp_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
546
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
547 type->tp_bases = value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
548 type->tp_base = new_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
549
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
550 if (mro_internal(type) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
551 goto bail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
552 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
553
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
554 temp = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
555 if (!temp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
556 goto bail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
557
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
558 r = mro_subclasses(type, temp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
559
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
560 if (r < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
561 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
562 PyTypeObject* cls;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
563 PyObject* mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
564 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
565 "", 2, 2, &cls, &mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
566 Py_INCREF(mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
567 ob = cls->tp_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
568 cls->tp_mro = mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
569 Py_DECREF(ob);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
570 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
571 Py_DECREF(temp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
572 goto bail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
573 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
574
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
575 Py_DECREF(temp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
576
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
577 /* 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
578 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
579 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
580 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
581
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
582 /* 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
583 add to all new_bases */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
584
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
585 remove_all_subclasses(type, old_bases);
61467
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 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
588 ob = PyTuple_GET_ITEM(value, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
589 if (PyType_Check(ob)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
590 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
591 r = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
592 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
593 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
594
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
595 update_all_slots(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
596
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
597 Py_DECREF(old_bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
598 Py_DECREF(old_base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
599 Py_DECREF(old_mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
600
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
601 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
602
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
603 bail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
604 Py_DECREF(type->tp_bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
605 Py_DECREF(type->tp_base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
606 if (type->tp_mro != old_mro) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
607 Py_DECREF(type->tp_mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
608 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
609
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
610 type->tp_bases = old_bases;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
611 type->tp_base = old_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
612 type->tp_mro = old_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
613
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
614 return -1;
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
615 }
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
616
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
617 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
618 type_dict(PyTypeObject *type, void *context)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
619 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
620 if (type->tp_dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
621 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
622 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
623 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
624 return PyDictProxy_New(type->tp_dict);
2080
c21cc7b3ce28 added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
625 }
c21cc7b3ce28 added getattr(), supporting __doc__ and _name__
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
626
22348
51aa9eb24d81 SF patch 530070: pydoc regression, from Martin and Guido.
Tim Peters <tim.peters@gmail.com>
parents: 22331
diff changeset
627 static PyObject *
51aa9eb24d81 SF patch 530070: pydoc regression, from Martin and Guido.
Tim Peters <tim.peters@gmail.com>
parents: 22331
diff changeset
628 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
629 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
630 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
631 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
632 return PyUnicode_FromString(type->tp_doc);
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
633 result = _PyDict_GetItemId(type->tp_dict, &PyId___doc__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
634 if (result == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
635 result = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
636 Py_INCREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
637 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
638 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
639 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
640 (PyObject *)type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
641 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
642 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
643 Py_INCREF(result);
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 return result;
22348
51aa9eb24d81 SF patch 530070: pydoc regression, from Martin and Guido.
Tim Peters <tim.peters@gmail.com>
parents: 22331
diff changeset
646 }
51aa9eb24d81 SF patch 530070: pydoc regression, from Martin and Guido.
Tim Peters <tim.peters@gmail.com>
parents: 22331
diff changeset
647
71895
ed2511c23dae make __doc__ mutable on heaptypes (closes #12773)
Benjamin Peterson <benjamin@python.org>
parents: 71894
diff changeset
648 static int
ed2511c23dae make __doc__ mutable on heaptypes (closes #12773)
Benjamin Peterson <benjamin@python.org>
parents: 71894
diff changeset
649 type_set_doc(PyTypeObject *type, PyObject *value, void *context)
ed2511c23dae make __doc__ mutable on heaptypes (closes #12773)
Benjamin Peterson <benjamin@python.org>
parents: 71894
diff changeset
650 {
ed2511c23dae make __doc__ mutable on heaptypes (closes #12773)
Benjamin Peterson <benjamin@python.org>
parents: 71894
diff changeset
651 if (!check_set_special_type_attr(type, value, "__doc__"))
ed2511c23dae make __doc__ mutable on heaptypes (closes #12773)
Benjamin Peterson <benjamin@python.org>
parents: 71894
diff changeset
652 return -1;
ed2511c23dae make __doc__ mutable on heaptypes (closes #12773)
Benjamin Peterson <benjamin@python.org>
parents: 71894
diff changeset
653 PyType_Modified(type);
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
654 return _PyDict_SetItemId(type->tp_dict, &PyId___doc__, value);
71895
ed2511c23dae make __doc__ mutable on heaptypes (closes #12773)
Benjamin Peterson <benjamin@python.org>
parents: 71894
diff changeset
655 }
ed2511c23dae make __doc__ mutable on heaptypes (closes #12773)
Benjamin Peterson <benjamin@python.org>
parents: 71894
diff changeset
656
48875
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
657 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
658 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
659 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
660 switch (_PyObject_RealIsInstance(inst, type)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
661 case -1:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
662 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
663 case 0:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
664 Py_RETURN_FALSE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
665 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
666 Py_RETURN_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
667 }
48875
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
668 }
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
669
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
670
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
671 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
672 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
673 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
674 switch (_PyObject_RealIsSubclass(inst, type)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
675 case -1:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
676 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
677 case 0:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
678 Py_RETURN_FALSE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
679 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
680 Py_RETURN_TRUE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
681 }
48875
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
682 }
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
683
d6e86a96f9b3 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48660
diff changeset
684
20595
c4d9d8674506 Add missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20586
diff changeset
685 static PyGetSetDef type_getsets[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
686 {"__name__", (getter)type_name, (setter)type_set_name, NULL},
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
687 {"__qualname__", (getter)type_qualname, (setter)type_set_qualname, NULL},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
688 {"__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
689 {"__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
690 {"__abstractmethods__", (getter)type_abstractmethods,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
691 (setter)type_set_abstractmethods, NULL},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
692 {"__dict__", (getter)type_dict, NULL, NULL},
71895
ed2511c23dae make __doc__ mutable on heaptypes (closes #12773)
Benjamin Peterson <benjamin@python.org>
parents: 71894
diff changeset
693 {"__doc__", (getter)type_get_doc, (setter)type_set_doc, NULL},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
694 {0}
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
695 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
696
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
697 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
698 type_repr(PyTypeObject *type)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
699 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
700 PyObject *mod, *name, *rtn;
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 mod = type_module(type, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
703 if (mod == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
704 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
705 else if (!PyUnicode_Check(mod)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
706 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
707 mod = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
708 }
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
709 name = type_qualname(type, NULL);
78940
9f4e6c0c18e6 Fixed possible reference leak to mod when type_name() returns NULL
Christian Heimes <christian@cheimes.de>
parents: 78856
diff changeset
710 if (name == NULL) {
9f4e6c0c18e6 Fixed possible reference leak to mod when type_name() returns NULL
Christian Heimes <christian@cheimes.de>
parents: 78856
diff changeset
711 Py_XDECREF(mod);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
712 return NULL;
78940
9f4e6c0c18e6 Fixed possible reference leak to mod when type_name() returns NULL
Christian Heimes <christian@cheimes.de>
parents: 78856
diff changeset
713 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
714
86999
01c4a0af73cf Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents: 86994
diff changeset
715 if (mod != NULL && _PyUnicode_CompareWithId(mod, &PyId_builtins))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
716 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
717 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
718 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
719
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
720 Py_XDECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
721 Py_DECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
722 return rtn;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
723 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
724
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
725 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
726 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
727 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
728 PyObject *obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
729
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
730 if (type->tp_new == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
731 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
732 "cannot create '%.100s' instances",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
733 type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
734 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
735 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
736
85416
8fb3a6f9b0a4 Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents: 85354
diff changeset
737 #ifdef Py_DEBUG
8fb3a6f9b0a4 Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents: 85354
diff changeset
738 /* type_call() must not be called with an exception set,
8fb3a6f9b0a4 Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents: 85354
diff changeset
739 because it may clear it (directly or indirectly) and so the
8fb3a6f9b0a4 Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents: 85354
diff changeset
740 caller looses its exception */
8fb3a6f9b0a4 Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents: 85354
diff changeset
741 assert(!PyErr_Occurred());
8fb3a6f9b0a4 Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents: 85354
diff changeset
742 #endif
8fb3a6f9b0a4 Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents: 85354
diff changeset
743
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
744 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
745 if (obj != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
746 /* 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
747 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
748 if (type == &PyType_Type &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
749 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
750 (kwds == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
751 (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
752 return obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
753 /* 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
754 it won't be initialized. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
755 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
756 return obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
757 type = Py_TYPE(obj);
84677
ffd3c6ee2a3a Cleanup type_call() to ease debug
Victor Stinner <victor.stinner@gmail.com>
parents: 84643
diff changeset
758 if (type->tp_init != NULL) {
ffd3c6ee2a3a Cleanup type_call() to ease debug
Victor Stinner <victor.stinner@gmail.com>
parents: 84643
diff changeset
759 int res = type->tp_init(obj, args, kwds);
ffd3c6ee2a3a Cleanup type_call() to ease debug
Victor Stinner <victor.stinner@gmail.com>
parents: 84643
diff changeset
760 if (res < 0) {
ffd3c6ee2a3a Cleanup type_call() to ease debug
Victor Stinner <victor.stinner@gmail.com>
parents: 84643
diff changeset
761 Py_DECREF(obj);
ffd3c6ee2a3a Cleanup type_call() to ease debug
Victor Stinner <victor.stinner@gmail.com>
parents: 84643
diff changeset
762 obj = NULL;
ffd3c6ee2a3a Cleanup type_call() to ease debug
Victor Stinner <victor.stinner@gmail.com>
parents: 84643
diff changeset
763 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
764 }
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 return obj;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
767 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
768
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
769 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36169
diff changeset
770 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
771 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
772 PyObject *obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
773 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
774 /* 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
775
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
776 if (PyType_IS_GC(type))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
777 obj = _PyObject_GC_Malloc(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
778 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
779 obj = (PyObject *)PyObject_MALLOC(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
780
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
781 if (obj == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
782 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
783
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
784 memset(obj, '\0', size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
785
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
786 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
787 Py_INCREF(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
788
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
789 if (type->tp_itemsize == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
790 PyObject_INIT(obj, type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
791 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
792 (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
793
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
794 if (PyType_IS_GC(type))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
795 _PyObject_GC_TRACK(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
796 return obj;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
797 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
798
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
799 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
800 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
801 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
802 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
803 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
804
20277
2983b54256c7 Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents: 20259
diff changeset
805 /* 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
806
2983b54256c7 Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents: 20259
diff changeset
807 static int
23666
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
808 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
809 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
810 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
811 PyMemberDef *mp;
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 n = Py_SIZE(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
814 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
815 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
816 if (mp->type == T_OBJECT_EX) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
817 char *addr = (char *)self + mp->offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
818 PyObject *obj = *(PyObject **)addr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
819 if (obj != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
820 int err = visit(obj, arg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
821 if (err)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
822 return err;
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
825 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
826 return 0;
23666
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
827 }
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
828
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
829 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
830 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
831 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
832 PyTypeObject *type, *base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
833 traverseproc basetraverse;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
834
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
835 /* 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
836 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
837 type = Py_TYPE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
838 base = type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
839 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
840 if (Py_SIZE(base)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
841 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
842 if (err)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
843 return err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
844 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
845 base = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
846 assert(base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
847 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
848
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
849 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
850 PyObject **dictptr = _PyObject_GetDictPtr(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
851 if (dictptr && *dictptr)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
852 Py_VISIT(*dictptr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
853 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
854
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
855 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
856 /* 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
857 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
858 can find cycles involving this link. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
859 Py_VISIT(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
860
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
861 if (basetraverse)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
862 return basetraverse(self, visit, arg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
863 return 0;
23666
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
864 }
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
865
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
866 static void
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
867 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
868 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
869 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
870 PyMemberDef *mp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
871
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
872 n = Py_SIZE(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
873 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
874 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
875 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
876 char *addr = (char *)self + mp->offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
877 PyObject *obj = *(PyObject **)addr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
878 if (obj != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
879 *(PyObject **)addr = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
880 Py_DECREF(obj);
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
883 }
23666
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
884 }
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
885
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
886 static int
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
887 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
888 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
889 PyTypeObject *type, *base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
890 inquiry baseclear;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
891
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
892 /* 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
893 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
894 type = Py_TYPE(self);
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 ((baseclear = base->tp_clear) == subtype_clear) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
897 if (Py_SIZE(base))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
898 clear_slots(base, self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
899 base = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
900 assert(base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
901 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
902
75482
3787e896dbe9 allow cycles throught the __dict__ slot to be cleared (closes #1469629)
Benjamin Peterson <benjamin@python.org>
parents: 74685
diff changeset
903 /* Clear the instance dict (if any), to break cycles involving only
3787e896dbe9 allow cycles throught the __dict__ slot to be cleared (closes #1469629)
Benjamin Peterson <benjamin@python.org>
parents: 74685
diff changeset
904 __dict__ slots (as in the case 'self.__dict__ is self'). */
3787e896dbe9 allow cycles throught the __dict__ slot to be cleared (closes #1469629)
Benjamin Peterson <benjamin@python.org>
parents: 74685
diff changeset
905 if (type->tp_dictoffset != base->tp_dictoffset) {
3787e896dbe9 allow cycles throught the __dict__ slot to be cleared (closes #1469629)
Benjamin Peterson <benjamin@python.org>
parents: 74685
diff changeset
906 PyObject **dictptr = _PyObject_GetDictPtr(self);
3787e896dbe9 allow cycles throught the __dict__ slot to be cleared (closes #1469629)
Benjamin Peterson <benjamin@python.org>
parents: 74685
diff changeset
907 if (dictptr && *dictptr)
3787e896dbe9 allow cycles throught the __dict__ slot to be cleared (closes #1469629)
Benjamin Peterson <benjamin@python.org>
parents: 74685
diff changeset
908 Py_CLEAR(*dictptr);
3787e896dbe9 allow cycles throught the __dict__ slot to be cleared (closes #1469629)
Benjamin Peterson <benjamin@python.org>
parents: 74685
diff changeset
909 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
910
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
911 if (baseclear)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
912 return baseclear(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
913 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
914 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
915
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
916 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
917 subtype_dealloc(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
918 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
919 PyTypeObject *type, *base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
920 destructor basedealloc;
78856
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 78604
diff changeset
921 PyThreadState *tstate = PyThreadState_GET();
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
922 int has_finalizer;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
923
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
924 /* 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
925 type = Py_TYPE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
926 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
927
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
928 /* 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
929
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
930 if (!PyType_IS_GC(type)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
931 /* 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
932 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
933 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
934 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
935 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
936
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
937 /* Maybe call finalizer; exit early if resurrected */
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
938 if (type->tp_finalize) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
939 if (PyObject_CallFinalizerFromDealloc(self) < 0)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
940 return;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
941 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
942 if (type->tp_del) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
943 type->tp_del(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
944 if (self->ob_refcnt > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
945 return;
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 /* 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
949 base = type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
950 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
951 assert(Py_SIZE(base) == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
952 base = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
953 assert(base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
954 }
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 /* 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
957 type = Py_TYPE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
958
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
959 /* Call the base tp_dealloc() */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
960 assert(basedealloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
961 basedealloc(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
962
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
963 /* 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
964 Py_DECREF(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
965
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
966 /* Done */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
967 return;
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
970 /* 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
971
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
972 /* 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
973 /* 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
974 PyObject_GC_UnTrack(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
975 ++_PyTrash_delete_nesting;
78856
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 78604
diff changeset
976 ++ tstate->trash_delete_nesting;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
977 Py_TRASHCAN_SAFE_BEGIN(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
978 --_PyTrash_delete_nesting;
78856
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 78604
diff changeset
979 -- tstate->trash_delete_nesting;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
980 /* 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
981 * (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
982 * 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
983 * 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
984 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
985
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
986 /* 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
987 base = type;
68102
e2f96bd29252 Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents: 68073
diff changeset
988 while ((/*basedealloc =*/ base->tp_dealloc) == subtype_dealloc) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
989 base = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
990 assert(base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
991 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
992
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
993 has_finalizer = type->tp_finalize || type->tp_del;
61467
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 /* Maybe call finalizer; exit early if resurrected */
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
996 if (has_finalizer)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
997 _PyObject_GC_TRACK(self);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
998
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
999 if (type->tp_finalize) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1000 if (PyObject_CallFinalizerFromDealloc(self) < 0) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1001 /* Resurrected */
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1002 goto endlabel;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1003 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1004 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1005 /* If we added a weaklist, we clear it. Do this *before* calling
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1006 tp_del, clearing slots, or clearing the instance dict. */
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1007 if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1008 PyObject_ClearWeakRefs(self);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1009
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1010 if (type->tp_del) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1011 type->tp_del(self);
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1012 if (self->ob_refcnt > 0) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1013 /* Resurrected */
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1014 goto endlabel;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1015 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1016 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1017 if (has_finalizer) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1018 _PyObject_GC_UNTRACK(self);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1019 /* New weakrefs could be created during the finalizer call.
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1020 If this occurs, clear them out without calling their
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1021 finalizers since they might rely on part of the object
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
1022 being finalized that has already been destroyed. */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1023 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
1024 /* Modeled after GET_WEAKREFS_LISTPTR() */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1025 PyWeakReference **list = (PyWeakReference **) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1026 PyObject_GET_WEAKREFS_LISTPTR(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1027 while (*list)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1028 _PyWeakref_ClearRef(*list);
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 }
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 /* 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
1033 base = type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1034 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
1035 if (Py_SIZE(base))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1036 clear_slots(base, self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1037 base = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1038 assert(base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1039 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1040
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1041 /* 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
1042 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
1043 PyObject **dictptr = _PyObject_GetDictPtr(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1044 if (dictptr != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1045 PyObject *dict = *dictptr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1046 if (dict != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1047 Py_DECREF(dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1048 *dictptr = NULL;
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1051 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1052
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1053 /* 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
1054 type = Py_TYPE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1055
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1056 /* 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
1057 * basedealloc knows about gc.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1058 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1059 if (PyType_IS_GC(base))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1060 _PyObject_GC_TRACK(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1061 assert(basedealloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1062 basedealloc(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1063
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1064 /* 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
1065 Py_DECREF(type);
24614
40eb80dc4250 Fix SF bug 574207 (chained __slots__ dealloc segfault).
Guido van Rossum <guido@python.org>
parents: 24460
diff changeset
1066
24653
1ab27c1770df Fix a subtle bug in the trashcan code I added yesterday to
Guido van Rossum <guido@python.org>
parents: 24614
diff changeset
1067 endlabel:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1068 ++_PyTrash_delete_nesting;
78856
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 78604
diff changeset
1069 ++ tstate->trash_delete_nesting;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1070 Py_TRASHCAN_SAFE_END(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1071 --_PyTrash_delete_nesting;
78856
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 78604
diff changeset
1072 -- tstate->trash_delete_nesting;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1073
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1074 /* 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
1075
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1076 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
1077
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1078 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
1079 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
1080 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
1081 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
1082 sense.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1083
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1084 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
1085 GC-track again afterward?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1086
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1087 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
1088 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
1089 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
1090 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
1091 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
1092 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
1093 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
1094 the dance becomes:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1095
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1096 GC untrack
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1097 trashcan begin
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1098 GC track
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1099
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1100 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
1101 It's nowhere near immediately.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1102
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1103 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
1104 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
1105 (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
1106 looks like trash to gc too, and gc also tries to delete self
68585
bf94b6a73fc8 #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 67653
diff changeset
1107 then. But we're already deleting self. Double deallocation is
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1108 a subtle disaster.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1109
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1110 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
1111 _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
1112
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1113 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
1114 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
1115
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1116 - 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
1117
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1118 - subtype_dealloc() is called
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1119
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1120 - 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
1121 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
1122 executed
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1123
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1124 - 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
1125 slots and __dict__
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1126
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1127 - 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
1128 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
1129
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1130 - 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
1131 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
1132
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1133 - basedealloc() returns
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1134
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1135 - 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
1136
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1137 - subtype_dealloc() returns
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1138
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1139 - 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
1140 to-be-deleted-later list
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1141
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1142 - 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
1143
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1144 - 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
1145 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
1146 time, which is *BAD*!!!
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1147
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1148 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
1149 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
1150 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
1151 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
1152 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
1153 block.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1154
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1155 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
1156 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
1157 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
1158 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
1159 *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
1160 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
1161 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
1162
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1163 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
1164 complexity?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1165
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1166 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
1167 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
1168 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
1169 and bug 574207.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1170 */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1171 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1172
24280
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24250
diff changeset
1173 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
1174
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1175 /* type test with subclassing support */
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1176
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1177 int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1178 PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1179 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1180 PyObject *mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1181
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1182 mro = a->tp_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1183 if (mro != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1184 /* Deal with multiple inheritance without recursion
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1185 by walking the MRO tuple */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1186 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1187 assert(PyTuple_Check(mro));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1188 n = PyTuple_GET_SIZE(mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1189 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1190 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
1191 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1192 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1193 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1194 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1195 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1196 /* 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
1197 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1198 if (a == b)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1199 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1200 a = a->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1201 } while (a != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1202 return b == &PyBaseObject_Type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1203 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1204 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1205
19913
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1206 /* 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
1207 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
1208 (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
1209 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
1210 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
1211 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
1212
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1213 Two variants:
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1214
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1215 - 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
1216 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
1217
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1218 - 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
1219
2993f049e2c9 Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53374
diff changeset
1220 - _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
1221 */
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
1222
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
1223 static PyObject *
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1224 lookup_maybe(PyObject *self, _Py_Identifier *attrid)
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
1225 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1226 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1227
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
1228 res = _PyType_LookupId(Py_TYPE(self), attrid);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1229 if (res != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1230 descrgetfunc f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1231 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
1232 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1233 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1234 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
1235 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1236 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
1237 }
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
1238
19913
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1239 static PyObject *
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1240 lookup_method(PyObject *self, _Py_Identifier *attrid)
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1241 {
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1242 PyObject *res = lookup_maybe(self, attrid);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1243 if (res == NULL && !PyErr_Occurred())
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1244 PyErr_SetObject(PyExc_AttributeError, attrid->object);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1245 return res;
19913
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1246 }
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1247
53905
2993f049e2c9 Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53374
diff changeset
1248 PyObject *
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1249 _PyObject_LookupSpecial(PyObject *self, _Py_Identifier *attrid)
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1250 {
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1251 return lookup_maybe(self, attrid);
53905
2993f049e2c9 Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53374
diff changeset
1252 }
2993f049e2c9 Merged revisions 72461 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53374
diff changeset
1253
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
1254 /* 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
1255 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
1256 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
1257
20595
c4d9d8674506 Add missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20586
diff changeset
1258 static PyObject *
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1259 call_method(PyObject *o, _Py_Identifier *nameid, char *format, ...)
19538
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
1260 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1261 va_list va;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1262 PyObject *args, *func = 0, *retval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1263 va_start(va, format);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1264
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1265 func = lookup_maybe(o, nameid);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1266 if (func == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1267 va_end(va);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1268 if (!PyErr_Occurred())
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1269 PyErr_SetObject(PyExc_AttributeError, nameid->object);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1270 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1271 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1272
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1273 if (format && *format)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1274 args = Py_VaBuildValue(format, va);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1275 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1276 args = PyTuple_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1277
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1278 va_end(va);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1279
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1280 if (args == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1281 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1282
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1283 assert(PyTuple_Check(args));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1284 retval = PyObject_Call(func, args, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1285
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1286 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1287 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1288
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1289 return retval;
19913
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1290 }
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1291
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1292 /* 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
1293
20595
c4d9d8674506 Add missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20586
diff changeset
1294 static PyObject *
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1295 call_maybe(PyObject *o, _Py_Identifier *nameid, char *format, ...)
19913
ca0f54dacdd8 Add call_maybe(): a variant of call_method() that returns
Guido van Rossum <guido@python.org>
parents: 19911
diff changeset
1296 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1297 va_list va;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1298 PyObject *args, *func = 0, *retval;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1299 va_start(va, format);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1300
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1301 func = lookup_maybe(o, nameid);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1302 if (func == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1303 va_end(va);
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 71357
diff changeset
1304 if (!PyErr_Occurred())
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 71357
diff changeset
1305 Py_RETURN_NOTIMPLEMENTED;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1306 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1307 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1308
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1309 if (format && *format)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1310 args = Py_VaBuildValue(format, va);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1311 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1312 args = PyTuple_New(0);
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 va_end(va);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1315
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1316 if (args == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1317 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1318
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1319 assert(PyTuple_Check(args));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1320 retval = PyObject_Call(func, args, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1321
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1322 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1323 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1324
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1325 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
1326 }
b4a3fc147929 Finish the previous checkin: also avoid getattr when calling the method
Guido van Rossum <guido@python.org>
parents: 19535
diff changeset
1327
26575
93b5ca9423eb slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents: 26559
diff changeset
1328 /*
26222
c95190532c0c Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents: 25853
diff changeset
1329 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
1330 "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
1331 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
1332 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
1333 (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
1334
26410
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1335 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
1336
26575
93b5ca9423eb slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents: 26559
diff changeset
1337 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
1338 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
1339
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1340 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
1341
26575
93b5ca9423eb slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents: 26559
diff changeset
1342 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
1343 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
1344 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
1345
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1346 Monotonicity.
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1347 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
1348 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
1349
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1350 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
1351 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
1352 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
1353 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
1354 */
c95190532c0c Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents: 25853
diff changeset
1355
26575
93b5ca9423eb slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents: 26559
diff changeset
1356 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
1357 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
1358 Py_ssize_t j, size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1359 size = PyList_GET_SIZE(list);
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 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
1362 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
1363 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1364 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1365 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
1366 }
c95190532c0c Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents: 25853
diff changeset
1367
26410
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1368 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
1369 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
1370 {
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
1371 PyObject *name = _PyObject_GetAttrId(cls, &PyId___name__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1372 if (name == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1373 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1374 Py_XDECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1375 name = PyObject_Repr(cls);
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 if (name == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1378 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1379 if (!PyUnicode_Check(name)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1380 Py_DECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1381 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1382 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1383 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
1384 }
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1385
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1386 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
1387 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
1388 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1389 Py_ssize_t i, j, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1390 /* 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
1391 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
1392 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1393 n = PyList_GET_SIZE(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1394 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1395 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
1396 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
1397 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
1398 o = class_name(o);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1399 if (o != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1400 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1401 "duplicate base class %U",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1402 o);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1403 Py_DECREF(o);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1404 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1405 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1406 "duplicate base class");
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 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1409 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1410 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1411 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1412 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
1413 }
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1414
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1415 /* 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
1416
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1417 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
1418 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
1419 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
1420 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
1421 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
1422 */
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1423
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1424 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
1425 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
1426 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1427 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
1428 char buf[1000];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1429 PyObject *k, *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1430 PyObject *set = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1431 if (!set) return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1432
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1433 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
1434 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
1435 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
1436 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
1437 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
1438 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
1439 Py_DECREF(set);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1440 return;
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1443 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1444 n = PyDict_Size(set);
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 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
1447 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
1448 i = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1449 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
1450 PyObject *name = class_name(k);
61721
89ce2f6d4b24 Issue #6697: Check that _PyUnicode_AsString() result is not NULL in typeobject
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
1451 char *name_str;
89ce2f6d4b24 Issue #6697: Check that _PyUnicode_AsString() result is not NULL in typeobject
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
1452 if (name != NULL) {
89ce2f6d4b24 Issue #6697: Check that _PyUnicode_AsString() result is not NULL in typeobject
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
1453 name_str = _PyUnicode_AsString(name);
89ce2f6d4b24 Issue #6697: Check that _PyUnicode_AsString() result is not NULL in typeobject
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
1454 if (name_str == NULL)
61722
7dcd1a269797 Ooops, add missing ";" in my previous commit (r81324, typeobject.c)
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61721
diff changeset
1455 name_str = "?";
61721
89ce2f6d4b24 Issue #6697: Check that _PyUnicode_AsString() result is not NULL in typeobject
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
1456 } else
61722
7dcd1a269797 Ooops, add missing ";" in my previous commit (r81324, typeobject.c)
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61721
diff changeset
1457 name_str = "?";
61721
89ce2f6d4b24 Issue #6697: Check that _PyUnicode_AsString() result is not NULL in typeobject
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
1458 off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s", name_str);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1459 Py_XDECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1460 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
1461 buf[off++] = ',';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1462 buf[off] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1463 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1464 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1465 PyErr_SetString(PyExc_TypeError, buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1466 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
1467 }
26918e2efd17 A tweaked version of Jeremy's patch #642489, to produce better error
Guido van Rossum <guido@python.org>
parents: 26227
diff changeset
1468
26575
93b5ca9423eb slot_nb_nonzero(): Another leak uncovered by the sandbox datetime
Tim Peters <tim.peters@gmail.com>
parents: 26559
diff changeset
1469 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
1470 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
1471 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
1472 int *remain;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1473 int ok;
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 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
1476
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1477 /* 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
1478 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
1479 that is not included in acc.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1480 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1481 remain = (int *)PyMem_MALLOC(SIZEOF_INT*to_merge_size);
84575
affb87b1d7ec Issue #18408: pmerge() help of mro_implementation() now raises MemoryError on
Victor Stinner <victor.stinner@gmail.com>
parents: 84561
diff changeset
1482 if (remain == NULL) {
affb87b1d7ec Issue #18408: pmerge() help of mro_implementation() now raises MemoryError on
Victor Stinner <victor.stinner@gmail.com>
parents: 84561
diff changeset
1483 PyErr_NoMemory();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1484 return -1;
84575
affb87b1d7ec Issue #18408: pmerge() help of mro_implementation() now raises MemoryError on
Victor Stinner <victor.stinner@gmail.com>
parents: 84561
diff changeset
1485 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1486 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
1487 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
1488
c95190532c0c Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents: 25853
diff changeset
1489 again:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1490 empty_cnt = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1491 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
1492 PyObject *candidate;
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 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
1495
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1496 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
1497 empty_cnt++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1498 continue;
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 /* Choose next candidate for MRO.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1502
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1503 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
1504 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
1505 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
1506 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1507
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1508 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
1509 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
1510 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
1511 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
1512 goto skip; /* continue outer loop */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1513 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1514 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1515 ok = PyList_Append(acc, candidate);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1516 if (ok < 0) {
84575
affb87b1d7ec Issue #18408: pmerge() help of mro_implementation() now raises MemoryError on
Victor Stinner <victor.stinner@gmail.com>
parents: 84561
diff changeset
1517 PyMem_FREE(remain);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1518 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1519 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1520 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
1521 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
1522 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
1523 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
1524 remain[j]++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1525 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1526 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1527 goto again;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1528 skip: ;
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1531 if (empty_cnt == to_merge_size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1532 PyMem_FREE(remain);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1533 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1534 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1535 set_mro_error(to_merge, remain);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1536 PyMem_FREE(remain);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1537 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
1538 }
c95190532c0c Use the new C3 MRO algorithm, implemented by Samuele Pedroni (SF patch
Guido van Rossum <guido@python.org>
parents: 25853
diff changeset
1539
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1540 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1541 mro_implementation(PyTypeObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1542 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1543 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1544 int ok;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1545 PyObject *bases, *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1546 PyObject *to_merge, *bases_aslist;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1547
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1548 if (type->tp_dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1549 if (PyType_Ready(type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1550 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1551 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1552
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1553 /* 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
1554 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
1555 each base class.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1556
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1557 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
1558 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
1559 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
1560 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1561
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1562 bases = type->tp_bases;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1563 n = PyTuple_GET_SIZE(bases);
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 to_merge = PyList_New(n+1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1566 if (to_merge == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1567 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1568
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1569 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1570 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
1571 PyObject *parentMRO;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1572 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
1573 if (parentMRO == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1574 Py_DECREF(to_merge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1575 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1576 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1577
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1578 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
1579 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1580
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1581 bases_aslist = PySequence_List(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1582 if (bases_aslist == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1583 Py_DECREF(to_merge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1584 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1585 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1586 /* 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
1587 if (check_duplicates(bases_aslist) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1588 Py_DECREF(to_merge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1589 Py_DECREF(bases_aslist);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1590 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1591 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1592 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
1593
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1594 result = Py_BuildValue("[O]", (PyObject *)type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1595 if (result == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1596 Py_DECREF(to_merge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1597 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1598 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1599
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1600 ok = pmerge(result, to_merge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1601 Py_DECREF(to_merge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1602 if (ok < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1603 Py_DECREF(result);
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1607 return result;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1608 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1609
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1610 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
1611 mro_external(PyObject *self)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1612 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1613 PyTypeObject *type = (PyTypeObject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1614
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1615 return mro_implementation(type);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1616 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1617
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1618 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1619 mro_internal(PyTypeObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1620 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1621 PyObject *mro, *result, *tuple;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1622 int checkit = 0;
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 if (Py_TYPE(type) == &PyType_Type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1625 result = mro_implementation(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1626 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1627 else {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1628 _Py_IDENTIFIER(mro);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1629 checkit = 1;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
1630 mro = lookup_method((PyObject *)type, &PyId_mro);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1631 if (mro == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1632 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1633 result = PyObject_CallObject(mro, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1634 Py_DECREF(mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1635 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1636 if (result == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1637 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1638 tuple = PySequence_Tuple(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1639 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1640 if (tuple == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1641 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1642 if (checkit) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1643 Py_ssize_t i, len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1644 PyObject *cls;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1645 PyTypeObject *solid;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1646
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1647 solid = solid_base(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1648
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1649 len = PyTuple_GET_SIZE(tuple);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1650
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1651 for (i = 0; i < len; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1652 PyTypeObject *t;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1653 cls = PyTuple_GET_ITEM(tuple, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1654 if (!PyType_Check(cls)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1655 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1656 "mro() returned a non-class ('%.500s')",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1657 Py_TYPE(cls)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1658 Py_DECREF(tuple);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1659 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1660 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1661 t = (PyTypeObject*)cls;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1662 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
1663 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1664 "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
1665 t->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1666 Py_DECREF(tuple);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1667 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1668 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1669 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1670 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1671 type->tp_mro = tuple;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1672
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1673 type_mro_modified(type, type->tp_mro);
73949
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
1674 /* corner case: the super class might have been hidden
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1675 from the custom MRO */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1676 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
1677
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1678 PyType_Modified(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1679
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1680 return 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1681 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1682
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1683
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1684 /* 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
1685 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
1686
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1687 static PyTypeObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1688 best_base(PyObject *bases)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1689 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1690 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1691 PyTypeObject *base, *winner, *candidate, *base_i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1692 PyObject *base_proto;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1693
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1694 assert(PyTuple_Check(bases));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1695 n = PyTuple_GET_SIZE(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1696 assert(n > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1697 base = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1698 winner = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1699 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1700 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
1701 if (!PyType_Check(base_proto)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1702 PyErr_SetString(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1703 PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1704 "bases must be types");
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 base_i = (PyTypeObject *)base_proto;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1708 if (base_i->tp_dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1709 if (PyType_Ready(base_i) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1710 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1711 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1712 candidate = solid_base(base_i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1713 if (winner == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1714 winner = candidate;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1715 base = base_i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1716 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1717 else if (PyType_IsSubtype(winner, candidate))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1718 ;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1719 else if (PyType_IsSubtype(candidate, winner)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1720 winner = candidate;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1721 base = base_i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1722 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1723 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1724 PyErr_SetString(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1725 PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1726 "multiple bases have "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1727 "instance lay-out conflict");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1728 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1729 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1730 }
73949
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
1731 assert (base != NULL);
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
1732
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1733 return base;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1734 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1735
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1736 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1737 extra_ivars(PyTypeObject *type, PyTypeObject *base)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1738 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1739 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
1740 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
1741
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1742 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
1743 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
1744 /* If itemsize is involved, stricter rules */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1745 return t_size != b_size ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1746 type->tp_itemsize != base->tp_itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1747 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1748 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
1749 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
1750 type->tp_flags & Py_TPFLAGS_HEAPTYPE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1751 t_size -= sizeof(PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1752 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
1753 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
1754 type->tp_flags & Py_TPFLAGS_HEAPTYPE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1755 t_size -= sizeof(PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1756
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1757 return t_size != b_size;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1758 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1759
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1760 static PyTypeObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1761 solid_base(PyTypeObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1762 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1763 PyTypeObject *base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1764
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1765 if (type->tp_base)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1766 base = solid_base(type->tp_base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1767 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1768 base = &PyBaseObject_Type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1769 if (extra_ivars(type, base))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1770 return type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1771 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1772 return base;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1773 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1774
24280
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24250
diff changeset
1775 static void object_dealloc(PyObject *);
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24250
diff changeset
1776 static int object_init(PyObject *, PyObject *, PyObject *);
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24250
diff changeset
1777 static int update_slot(PyTypeObject *, PyObject *);
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24250
diff changeset
1778 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
1779
41716
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1780 /*
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1781 * 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
1782 * 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
1783 * 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
1784 */
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1785 static PyTypeObject *
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1786 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
1787 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1788 while (type->tp_base != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1789 if (type->tp_dictoffset != 0 &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1790 !(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1791 return type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1792 type = type->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1793 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1794 return NULL;
41716
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1795 }
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1796
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1797 static PyObject *
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1798 get_dict_descriptor(PyTypeObject *type)
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1799 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1800 PyObject *descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1801
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
1802 descr = _PyType_LookupId(type, &PyId___dict__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1803 if (descr == NULL || !PyDescr_IsData(descr))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1804 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1805
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1806 return descr;
41716
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1807 }
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1808
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1809 static void
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1810 raise_dict_descr_error(PyObject *obj)
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1811 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1812 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1813 "this __dict__ descriptor does not support "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1814 "'%.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
1815 }
00c02c4488ce Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1816
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
1817 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
1818 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
1819 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1820 PyTypeObject *base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1821
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1822 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
1823 if (base != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1824 descrgetfunc func;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1825 PyObject *descr = get_dict_descriptor(base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1826 if (descr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1827 raise_dict_descr_error(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1828 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1829 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1830 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
1831 if (func == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1832 raise_dict_descr_error(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1833 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1834 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1835 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
1836 }
75050
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74686
diff changeset
1837 return PyObject_GenericGetDict(obj, context);
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
1838 }
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
1839
20681
a0f1c2d2ac9e Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents: 20599
diff changeset
1840 static int
a0f1c2d2ac9e Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents: 20599
diff changeset
1841 subtype_setdict(PyObject *obj, PyObject *value, void *context)
a0f1c2d2ac9e Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents: 20599
diff changeset
1842 {
75050
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74686
diff changeset
1843 PyObject *dict, **dictptr;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1844 PyTypeObject *base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1845
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1846 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
1847 if (base != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1848 descrsetfunc func;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1849 PyObject *descr = get_dict_descriptor(base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1850 if (descr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1851 raise_dict_descr_error(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1852 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1853 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1854 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
1855 if (func == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1856 raise_dict_descr_error(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1857 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1858 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1859 return func(descr, obj, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1860 }
75050
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74686
diff changeset
1861 /* Almost like PyObject_GenericSetDict, but allow __dict__ to be deleted. */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1862 dictptr = _PyObject_GetDictPtr(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1863 if (dictptr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1864 PyErr_SetString(PyExc_AttributeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1865 "This object has no __dict__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1866 return -1;
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 if (value != NULL && !PyDict_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1869 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1870 "__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
1871 "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
1872 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1873 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1874 dict = *dictptr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1875 Py_XINCREF(value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1876 *dictptr = value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1877 Py_XDECREF(dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1878 return 0;
20681
a0f1c2d2ac9e Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents: 20599
diff changeset
1879 }
a0f1c2d2ac9e Allow assignment to newinstance.__dict__.
Guido van Rossum <guido@python.org>
parents: 20599
diff changeset
1880
24761
e0431d9c4474 Refactor how __dict__ and __weakref__ interact with __slots__.
Guido van Rossum <guido@python.org>
parents: 24728
diff changeset
1881 static PyObject *
e0431d9c4474 Refactor how __dict__ and __weakref__ interact with __slots__.
Guido van Rossum <guido@python.org>
parents: 24728
diff changeset
1882 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
1883 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1884 PyObject **weaklistptr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1885 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1886
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1887 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
1888 PyErr_SetString(PyExc_AttributeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1889 "This object has no __weakref__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1890 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1891 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1892 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
1893 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
1894 (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
1895 weaklistptr = (PyObject **)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1896 ((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
1897 if (*weaklistptr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1898 result = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1899 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1900 result = *weaklistptr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1901 Py_INCREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1902 return result;
24761
e0431d9c4474 Refactor how __dict__ and __weakref__ interact with __slots__.
Guido van Rossum <guido@python.org>
parents: 24728
diff changeset
1903 }
e0431d9c4474 Refactor how __dict__ and __weakref__ interact with __slots__.
Guido van Rossum <guido@python.org>
parents: 24728
diff changeset
1904
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
1905 /* 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
1906
22d660494f29 Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents: 27124
diff changeset
1907 static PyGetSetDef subtype_getsets_full[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1908 {"__dict__", subtype_dict, subtype_setdict,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1909 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
1910 {"__weakref__", subtype_getweakref, NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1911 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
1912 {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
1913 };
337b53679c73 Pytype_GenericAlloc(): round up size so we zap all four bytes of the
Guido van Rossum <guido@python.org>
parents: 19595
diff changeset
1914
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
1915 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
1916 {"__dict__", subtype_dict, subtype_setdict,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1917 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
1918 {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
1919 };
22d660494f29 Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents: 27124
diff changeset
1920
22d660494f29 Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents: 27124
diff changeset
1921 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
1922 {"__weakref__", subtype_getweakref, NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1923 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
1924 {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
1925 };
22d660494f29 Fix for SF bug #642358: only provide a new with a __dict__ or
Guido van Rossum <guido@python.org>
parents: 27124
diff changeset
1926
23666
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
1927 static int
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
1928 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
1929 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1930 if (!PyUnicode_Check(s)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1931 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1932 "__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
1933 Py_TYPE(s)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1934 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1935 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1936 if (!PyUnicode_IsIdentifier(s)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1937 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1938 "__slots__ must be identifiers");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1939 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1940 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1941 return 1;
23666
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
1942 }
2becb5793acd Address SF bug 519621: slots weren't traversed by GC.
Guido van Rossum <guido@python.org>
parents: 23649
diff changeset
1943
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
1944 /* Forward */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
1945 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
1946 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
1947
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
1948 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
1949 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
1950 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1951 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1952
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1953 assert(args != NULL && PyTuple_Check(args));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1954 assert(kwds == NULL || PyDict_Check(kwds));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1955
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1956 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
1957 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1958 "type.__init__() takes no keyword arguments");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1959 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1960 }
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 if (args != NULL && PyTuple_Check(args) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1963 (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
1964 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1965 "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
1966 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1967 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1968
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1969 /* Call object.__init__(self) now. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1970 /* 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
1971 args = PyTuple_GetSlice(args, 0, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1972 res = object_init(cls, args, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1973 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
1974 return res;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
1975 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
1976
80065
10795aac6df7 Issue #16086: PyTypeObject.tp_flags and PyType_Spec.flags are now unsigned
Victor Stinner <victor.stinner@gmail.com>
parents: 79049
diff changeset
1977 unsigned long
67877
aca91c55f38d Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check
Martin v. Löwis <martin@v.loewis.de>
parents: 67651
diff changeset
1978 PyType_GetFlags(PyTypeObject *type)
aca91c55f38d Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check
Martin v. Löwis <martin@v.loewis.de>
parents: 67651
diff changeset
1979 {
aca91c55f38d Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check
Martin v. Löwis <martin@v.loewis.de>
parents: 67651
diff changeset
1980 return type->tp_flags;
aca91c55f38d Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check
Martin v. Löwis <martin@v.loewis.de>
parents: 67651
diff changeset
1981 }
aca91c55f38d Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check
Martin v. Löwis <martin@v.loewis.de>
parents: 67651
diff changeset
1982
73061
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1983 /* Determine the most derived metatype. */
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1984 PyTypeObject *
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1985 _PyType_CalculateMetaclass(PyTypeObject *metatype, PyObject *bases)
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1986 {
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1987 Py_ssize_t i, nbases;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1988 PyTypeObject *winner;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1989 PyObject *tmp;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1990 PyTypeObject *tmptype;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1991
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1992 /* Determine the proper metatype to deal with this,
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1993 and check for metatype conflicts while we're at it.
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1994 Note that if some other metatype wins to contract,
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1995 it's possible that its instances are not types. */
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1996
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1997 nbases = PyTuple_GET_SIZE(bases);
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1998 winner = metatype;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
1999 for (i = 0; i < nbases; i++) {
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2000 tmp = PyTuple_GET_ITEM(bases, i);
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2001 tmptype = Py_TYPE(tmp);
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2002 if (PyType_IsSubtype(winner, tmptype))
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2003 continue;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2004 if (PyType_IsSubtype(tmptype, winner)) {
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2005 winner = tmptype;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2006 continue;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2007 }
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2008 /* else: */
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2009 PyErr_SetString(PyExc_TypeError,
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2010 "metaclass conflict: "
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2011 "the metaclass of a derived class "
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2012 "must be a (non-strict) subclass "
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2013 "of the metaclasses of all its bases");
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2014 return NULL;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2015 }
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2016 return winner;
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2017 }
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2018
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
2019 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2020 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
2021 {
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2022 PyObject *name, *bases = NULL, *orig_dict, *dict = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2023 static char *kwlist[] = {"name", "bases", "dict", 0};
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2024 PyObject *qualname, *slots = NULL, *tmp, *newslots;
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2025 PyTypeObject *type = NULL, *base, *tmptype, *winner;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2026 PyHeapTypeObject *et;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2027 PyMemberDef *mp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2028 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
2029 int j, may_add_dict, may_add_weak;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2030 _Py_IDENTIFIER(__qualname__);
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2031 _Py_IDENTIFIER(__slots__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2032
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2033 assert(args != NULL && PyTuple_Check(args));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2034 assert(kwds == NULL || PyDict_Check(kwds));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2035
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2036 /* 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
2037 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2038 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
2039 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
2040
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2041 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
2042 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
2043 Py_INCREF(Py_TYPE(x));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2044 return (PyObject *) Py_TYPE(x);
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2047 /* 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
2048 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
2049 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
2050 if (nargs + nkwds != 3) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2051 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2052 "type() takes 1 or 3 arguments");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2053 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2054 }
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 /* Check arguments: (name, bases, dict) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2058 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
2059 &name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2060 &PyTuple_Type, &bases,
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2061 &PyDict_Type, &orig_dict))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2062 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2063
73061
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2064 /* Determine the proper metatype to deal with this: */
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2065 winner = _PyType_CalculateMetaclass(metatype, bases);
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2066 if (winner == NULL) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2067 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2068 }
73061
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2069
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2070 if (winner != metatype) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2071 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
2072 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
2073 metatype = winner;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2074 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2075
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2076 /* Adjust for empty tuple bases */
73061
c2a89b509be4 Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban.
Nick Coghlan <ncoghlan@gmail.com>
parents: 71889
diff changeset
2077 nbases = PyTuple_GET_SIZE(bases);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2078 if (nbases == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2079 bases = PyTuple_Pack(1, &PyBaseObject_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2080 if (bases == NULL)
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2081 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2082 nbases = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2083 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2084 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2085 Py_INCREF(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2086
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2087 /* 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
2088 base = best_base(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2089 if (base == NULL) {
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2090 goto error;
61467
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 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
2093 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2094 "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
2095 base->tp_name);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2096 goto error;
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2097 }
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2098
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2099 dict = PyDict_Copy(orig_dict);
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2100 if (dict == NULL)
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2101 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2102
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2103 /* Check for a __slots__ sequence variable in dict, and count it */
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2104 slots = _PyDict_GetItemId(dict, &PyId___slots__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2105 nslots = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2106 add_dict = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2107 add_weak = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2108 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
2109 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
2110 if (slots == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2111 if (may_add_dict) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2112 add_dict++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2113 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2114 if (may_add_weak) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2115 add_weak++;
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 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2119 /* Have slots */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2120
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2121 /* Make it into a tuple */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2122 if (PyUnicode_Check(slots))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2123 slots = PyTuple_Pack(1, slots);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2124 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2125 slots = PySequence_Tuple(slots);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2126 if (slots == NULL)
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2127 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2128 assert(PyTuple_Check(slots));
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 /* Are slots allowed? */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2131 nslots = PyTuple_GET_SIZE(slots);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2132 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
2133 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2134 "nonempty __slots__ "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2135 "not supported for subtype of '%s'",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2136 base->tp_name);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2137 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2138 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2139
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2140 /* 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
2141 for (i = 0; i < nslots; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2142 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
2143 if (!valid_identifier(tmp))
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2144 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2145 assert(PyUnicode_Check(tmp));
86980
77bebcf5c4cf Issue #19512: add _PyUnicode_CompareWithId() function
Victor Stinner <victor.stinner@gmail.com>
parents: 86969
diff changeset
2146 if (_PyUnicode_CompareWithId(tmp, &PyId___dict__) == 0) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2147 if (!may_add_dict || add_dict) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2148 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2149 "__dict__ slot disallowed: "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2150 "we already got one");
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2151 goto error;
61467
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 add_dict++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2154 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2155 if (PyUnicode_CompareWithASCIIString(tmp, "__weakref__") == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2156 if (!may_add_weak || add_weak) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2157 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2158 "__weakref__ slot disallowed: "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2159 "either we already got one, "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2160 "or __itemsize__ != 0");
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2161 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2162 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2163 add_weak++;
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2166
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2167 /* 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
2168 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
2169 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
2170 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2171 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
2172 if (newslots == NULL)
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2173 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2174 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
2175 tmp = PyTuple_GET_ITEM(slots, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2176 if ((add_dict &&
86980
77bebcf5c4cf Issue #19512: add _PyUnicode_CompareWithId() function
Victor Stinner <victor.stinner@gmail.com>
parents: 86969
diff changeset
2177 _PyUnicode_CompareWithId(tmp, &PyId___dict__) == 0) ||
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2178 (add_weak &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2179 PyUnicode_CompareWithASCIIString(tmp, "__weakref__") == 0))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2180 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2181 tmp =_Py_Mangle(name, tmp);
71889
f0515cc7ee20 fix possible refleaks
Benjamin Peterson <benjamin@python.org>
parents: 71356
diff changeset
2182 if (!tmp) {
f0515cc7ee20 fix possible refleaks
Benjamin Peterson <benjamin@python.org>
parents: 71356
diff changeset
2183 Py_DECREF(newslots);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2184 goto error;
71889
f0515cc7ee20 fix possible refleaks
Benjamin Peterson <benjamin@python.org>
parents: 71356
diff changeset
2185 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2186 PyList_SET_ITEM(newslots, j, tmp);
71888
45b63a8a76c9 complain when a class variable shadows a name in __slots__ (closes #12766)
Benjamin Peterson <benjamin@python.org>
parents: 71810
diff changeset
2187 if (PyDict_GetItem(dict, tmp)) {
45b63a8a76c9 complain when a class variable shadows a name in __slots__ (closes #12766)
Benjamin Peterson <benjamin@python.org>
parents: 71810
diff changeset
2188 PyErr_Format(PyExc_ValueError,
45b63a8a76c9 complain when a class variable shadows a name in __slots__ (closes #12766)
Benjamin Peterson <benjamin@python.org>
parents: 71810
diff changeset
2189 "%R in __slots__ conflicts with class variable",
45b63a8a76c9 complain when a class variable shadows a name in __slots__ (closes #12766)
Benjamin Peterson <benjamin@python.org>
parents: 71810
diff changeset
2190 tmp);
71892
3d1cdbd76fbe crush other possible refleaks in this section
Benjamin Peterson <benjamin@python.org>
parents: 71891
diff changeset
2191 Py_DECREF(newslots);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2192 goto error;
71888
45b63a8a76c9 complain when a class variable shadows a name in __slots__ (closes #12766)
Benjamin Peterson <benjamin@python.org>
parents: 71810
diff changeset
2193 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2194 j++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2195 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2196 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
2197 nslots = j;
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2198 Py_CLEAR(slots);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2199 if (PyList_Sort(newslots) == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2200 Py_DECREF(newslots);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2201 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2202 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2203 slots = PyList_AsTuple(newslots);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2204 Py_DECREF(newslots);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2205 if (slots == NULL)
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2206 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2207
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2208 /* 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
2209 if (nbases > 1 &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2210 ((may_add_dict && !add_dict) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2211 (may_add_weak && !add_weak))) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2212 for (i = 0; i < nbases; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2213 tmp = PyTuple_GET_ITEM(bases, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2214 if (tmp == (PyObject *)base)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2215 continue; /* Skip primary base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2216 assert(PyType_Check(tmp));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2217 tmptype = (PyTypeObject *)tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2218 if (may_add_dict && !add_dict &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2219 tmptype->tp_dictoffset != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2220 add_dict++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2221 if (may_add_weak && !add_weak &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2222 tmptype->tp_weaklistoffset != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2223 add_weak++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2224 if (may_add_dict && !add_dict)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2225 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2226 if (may_add_weak && !add_weak)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2227 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2228 /* Nothing more to check */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2229 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2230 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2231 }
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2234 /* Allocate the type object */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2235 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2236 if (type == NULL)
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2237 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2238
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2239 /* 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
2240 et = (PyHeapTypeObject *)type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2241 Py_INCREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2242 et->ht_name = name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2243 et->ht_slots = slots;
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2244 slots = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2245
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2246 /* Initialize tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2247 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
2248 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_FINALIZE;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2249 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
2250 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
2251
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2252 /* Initialize essential fields */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2253 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
2254 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
2255 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
2256 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
2257 type->tp_name = _PyUnicode_AsString(name);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2258 if (!type->tp_name)
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2259 goto error;
61467
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 /* Set tp_base and tp_bases */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2262 type->tp_bases = bases;
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2263 bases = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2264 Py_INCREF(base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2265 type->tp_base = base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2266
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2267 /* Initialize tp_dict from passed-in dict */
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2268 Py_INCREF(dict);
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2269 type->tp_dict = dict;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2270
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2271 /* Set __module__ in the dict */
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2272 if (_PyDict_GetItemId(dict, &PyId___module__) == NULL) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2273 tmp = PyEval_GetGlobals();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2274 if (tmp != NULL) {
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2275 tmp = _PyDict_GetItemId(tmp, &PyId___name__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2276 if (tmp != NULL) {
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2277 if (_PyDict_SetItemId(dict, &PyId___module__,
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2278 tmp) < 0)
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2279 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2280 }
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2283
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2284 /* Set ht_qualname to dict['__qualname__'] if available, else to
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2285 __name__. The __qualname__ accessor will look for ht_qualname.
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2286 */
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2287 qualname = _PyDict_GetItemId(dict, &PyId___qualname__);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2288 if (qualname != NULL) {
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2289 if (!PyUnicode_Check(qualname)) {
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2290 PyErr_Format(PyExc_TypeError,
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2291 "type __qualname__ must be a str, not %s",
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2292 Py_TYPE(qualname)->tp_name);
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2293 goto error;
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2294 }
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2295 }
80077
1d700e1aff33 don't shadow the __qualname__ descriptor with __qualname__ in the class's __dict__ (closes #16271)
Benjamin Peterson <benjamin@python.org>
parents: 79049
diff changeset
2296 et->ht_qualname = qualname ? qualname : et->ht_name;
1d700e1aff33 don't shadow the __qualname__ descriptor with __qualname__ in the class's __dict__ (closes #16271)
Benjamin Peterson <benjamin@python.org>
parents: 79049
diff changeset
2297 Py_INCREF(et->ht_qualname);
1d700e1aff33 don't shadow the __qualname__ descriptor with __qualname__ in the class's __dict__ (closes #16271)
Benjamin Peterson <benjamin@python.org>
parents: 79049
diff changeset
2298 if (qualname != NULL && PyDict_DelItem(dict, PyId___qualname__.object) < 0)
1d700e1aff33 don't shadow the __qualname__ descriptor with __qualname__ in the class's __dict__ (closes #16271)
Benjamin Peterson <benjamin@python.org>
parents: 79049
diff changeset
2299 goto error;
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2300
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2301 /* 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
2302 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
2303 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
2304 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2305 {
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2306 PyObject *doc = _PyDict_GetItemId(dict, &PyId___doc__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2307 if (doc != NULL && PyUnicode_Check(doc)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2308 Py_ssize_t len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2309 char *doc_str;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2310 char *tp_doc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2311
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2312 doc_str = _PyUnicode_AsString(doc);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2313 if (doc_str == NULL)
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2314 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2315 /* 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
2316 len = strlen(doc_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2317 tp_doc = (char *)PyObject_MALLOC(len + 1);
84643
c676fc74d779 Issue #18408: type_new() and PyType_FromSpecWithBases() now raise MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84575
diff changeset
2318 if (tp_doc == NULL) {
c676fc74d779 Issue #18408: type_new() and PyType_FromSpecWithBases() now raise MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84575
diff changeset
2319 PyErr_NoMemory();
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2320 goto error;
84643
c676fc74d779 Issue #18408: type_new() and PyType_FromSpecWithBases() now raise MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84575
diff changeset
2321 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2322 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
2323 type->tp_doc = tp_doc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2324 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2325 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2326
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2327 /* 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
2328 make it a static function */
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2329 tmp = _PyDict_GetItemId(dict, &PyId___new__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2330 if (tmp != NULL && PyFunction_Check(tmp)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2331 tmp = PyStaticMethod_New(tmp);
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2332 if (tmp == NULL)
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2333 goto error;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2334 if (_PyDict_SetItemId(dict, &PyId___new__, tmp) < 0)
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2335 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2336 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2337 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2338
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2339 /* 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
2340 mp = PyHeapType_GET_MEMBERS(et);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2341 slotoffset = base->tp_basicsize;
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2342 if (et->ht_slots != NULL) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2343 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
2344 mp->name = _PyUnicode_AsString(
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2345 PyTuple_GET_ITEM(et->ht_slots, i));
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2346 if (mp->name == NULL)
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2347 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2348 mp->type = T_OBJECT_EX;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2349 mp->offset = slotoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2350
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2351 /* __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
2352 assert(strcmp(mp->name, "__dict__") != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2353 assert(strcmp(mp->name, "__weakref__") != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2354
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2355 slotoffset += sizeof(PyObject *);
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2358 if (add_dict) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2359 if (base->tp_itemsize)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2360 type->tp_dictoffset = -(long)sizeof(PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2361 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2362 type->tp_dictoffset = slotoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2363 slotoffset += sizeof(PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2364 }
76485
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2365 if (type->tp_dictoffset) {
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2366 et->ht_cached_keys = _PyDict_NewKeysForClass();
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2367 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2368 if (add_weak) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2369 assert(!base->tp_itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2370 type->tp_weaklistoffset = slotoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2371 slotoffset += sizeof(PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2372 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2373 type->tp_basicsize = slotoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2374 type->tp_itemsize = base->tp_itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2375 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
2376
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2377 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
2378 type->tp_getset = subtype_getsets_full;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2379 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
2380 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
2381 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
2382 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
2383 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2384 type->tp_getset = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2385
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2386 /* Special case some slots */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2387 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
2388 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
2389 type->tp_getattro = PyObject_GenericGetAttr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2390 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
2391 type->tp_setattro = PyObject_GenericSetAttr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2392 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2393 type->tp_dealloc = subtype_dealloc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2394
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2395 /* 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
2396 if (!(type->tp_basicsize == sizeof(PyObject) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2397 type->tp_itemsize == 0))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2398 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
2399
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2400 /* 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
2401 type->tp_alloc = PyType_GenericAlloc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2402 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
2403 type->tp_free = PyObject_GC_Del;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2404 type->tp_traverse = subtype_traverse;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2405 type->tp_clear = subtype_clear;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2406 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2407 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2408 type->tp_free = PyObject_Del;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2409
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2410 /* Initialize the rest */
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2411 if (PyType_Ready(type) < 0)
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2412 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2413
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2414 /* Put the proper slots in place */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2415 fixup_slot_dispatchers(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2416
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2417 Py_DECREF(dict);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2418 return (PyObject *)type;
75249
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2419
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2420 error:
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2421 Py_XDECREF(dict);
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2422 Py_XDECREF(bases);
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2423 Py_XDECREF(slots);
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2424 Py_XDECREF(type);
b83ae75beaca Close #14095: type.__new__() doesn't remove __qualname__ key from the class
Victor Stinner <victor.stinner@gmail.com>
parents: 75054
diff changeset
2425 return NULL;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2426 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2427
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2428 static short slotoffsets[] = {
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2429 -1, /* invalid slot */
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2430 #include "typeslots.inc"
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2431 };
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2432
74684
32816454ba30 adjust declaration
Benjamin Peterson <benjamin@python.org>
parents: 73978
diff changeset
2433 PyObject *
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2434 PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2435 {
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2436 PyHeapTypeObject *res = (PyHeapTypeObject*)PyType_GenericAlloc(&PyType_Type, 0);
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2437 PyTypeObject *type, *base;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2438 char *s;
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2439 char *res_start = (char*)res;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2440 PyType_Slot *slot;
84560
a2d6274e2fc8 typeobject.c: remove trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 84512
diff changeset
2441
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2442 /* Set the type name and qualname */
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2443 s = strrchr(spec->name, '.');
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2444 if (s == NULL)
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2445 s = (char*)spec->name;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2446 else
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2447 s++;
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2448
68073
7b011cf64f90 - Check for NULL result in PyType_FromSpec.
Martin v. Löwis <martin@v.loewis.de>
parents: 67962
diff changeset
2449 if (res == NULL)
77655
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2450 return NULL;
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2451 type = &res->ht_type;
77659
33737210c906 Try to fix crash on x86 OpenIndiana buildbot.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77658
diff changeset
2452 /* The flags must be initialized early, before the GC traverses us */
33737210c906 Try to fix crash on x86 OpenIndiana buildbot.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77658
diff changeset
2453 type->tp_flags = spec->flags | Py_TPFLAGS_HEAPTYPE;
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2454 res->ht_name = PyUnicode_FromString(s);
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2455 if (!res->ht_name)
76925
6b037a9eaba7 Remove tab characters
Antoine Pitrou <solipsis@pitrou.net>
parents: 76924
diff changeset
2456 goto fail;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
2457 res->ht_qualname = res->ht_name;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
2458 Py_INCREF(res->ht_qualname);
77655
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2459 type->tp_name = spec->name;
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2460 if (!type->tp_name)
76925
6b037a9eaba7 Remove tab characters
Antoine Pitrou <solipsis@pitrou.net>
parents: 76924
diff changeset
2461 goto fail;
84560
a2d6274e2fc8 typeobject.c: remove trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 84512
diff changeset
2462
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2463 /* Adjust for empty tuple bases */
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2464 if (!bases) {
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2465 base = &PyBaseObject_Type;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2466 /* See whether Py_tp_base(s) was specified */
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2467 for (slot = spec->slots; slot->slot; slot++) {
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2468 if (slot->slot == Py_tp_base)
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2469 base = slot->pfunc;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2470 else if (slot->slot == Py_tp_bases) {
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2471 bases = slot->pfunc;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2472 Py_INCREF(bases);
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2473 }
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2474 }
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2475 if (!bases)
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2476 bases = PyTuple_Pack(1, base);
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2477 if (!bases)
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2478 goto fail;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2479 }
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2480 else
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2481 Py_INCREF(bases);
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2482
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2483 /* Calculate best base, and check that all bases are type objects */
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2484 base = best_base(bases);
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2485 if (base == NULL) {
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2486 goto fail;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2487 }
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2488 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2489 PyErr_Format(PyExc_TypeError,
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2490 "type '%.100s' is not an acceptable base type",
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2491 base->tp_name);
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2492 goto fail;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2493 }
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2494
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2495 /* Initialize essential fields */
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2496 type->tp_as_number = &res->as_number;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2497 type->tp_as_sequence = &res->as_sequence;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2498 type->tp_as_mapping = &res->as_mapping;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2499 type->tp_as_buffer = &res->as_buffer;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2500 /* Set tp_base and tp_bases */
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2501 type->tp_bases = bases;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2502 bases = NULL;
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2503 Py_INCREF(base);
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2504 type->tp_base = base;
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2505
77655
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2506 type->tp_basicsize = spec->basicsize;
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2507 type->tp_itemsize = spec->itemsize;
67347
3bf4d9f1660a Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66664
diff changeset
2508
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2509 for (slot = spec->slots; slot->slot; slot++) {
72510
b534b56379cb Use the new Py_ARRAY_LENGTH macro
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72504
diff changeset
2510 if (slot->slot >= Py_ARRAY_LENGTH(slotoffsets)) {
76925
6b037a9eaba7 Remove tab characters
Antoine Pitrou <solipsis@pitrou.net>
parents: 76924
diff changeset
2511 PyErr_SetString(PyExc_RuntimeError, "invalid slot offset");
6b037a9eaba7 Remove tab characters
Antoine Pitrou <solipsis@pitrou.net>
parents: 76924
diff changeset
2512 goto fail;
6b037a9eaba7 Remove tab characters
Antoine Pitrou <solipsis@pitrou.net>
parents: 76924
diff changeset
2513 }
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2514 if (slot->slot == Py_tp_base || slot->slot == Py_tp_bases)
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2515 /* Processed above */
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2516 continue;
76925
6b037a9eaba7 Remove tab characters
Antoine Pitrou <solipsis@pitrou.net>
parents: 76924
diff changeset
2517 *(void**)(res_start + slotoffsets[slot->slot]) = slot->pfunc;
67962
788eafaef7dc #11249: in PyType_FromSpec, copy tp_doc slot since it usually will point to a static string literal which should not be deallocated together with the type.
Georg Brandl <georg@python.org>
parents: 67877
diff changeset
2518
788eafaef7dc #11249: in PyType_FromSpec, copy tp_doc slot since it usually will point to a static string literal which should not be deallocated together with the type.
Georg Brandl <georg@python.org>
parents: 67877
diff changeset
2519 /* need to make a copy of the docstring slot, which usually
788eafaef7dc #11249: in PyType_FromSpec, copy tp_doc slot since it usually will point to a static string literal which should not be deallocated together with the type.
Georg Brandl <georg@python.org>
parents: 67877
diff changeset
2520 points to a static string literal */
788eafaef7dc #11249: in PyType_FromSpec, copy tp_doc slot since it usually will point to a static string literal which should not be deallocated together with the type.
Georg Brandl <georg@python.org>
parents: 67877
diff changeset
2521 if (slot->slot == Py_tp_doc) {
76924
2bbf3ba30435 Use size_t, not ssize_t (issue #14801).
Antoine Pitrou <solipsis@pitrou.net>
parents: 76836
diff changeset
2522 size_t len = strlen(slot->pfunc)+1;
67962
788eafaef7dc #11249: in PyType_FromSpec, copy tp_doc slot since it usually will point to a static string literal which should not be deallocated together with the type.
Georg Brandl <georg@python.org>
parents: 67877
diff changeset
2523 char *tp_doc = PyObject_MALLOC(len);
84643
c676fc74d779 Issue #18408: type_new() and PyType_FromSpecWithBases() now raise MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84575
diff changeset
2524 if (tp_doc == NULL) {
c676fc74d779 Issue #18408: type_new() and PyType_FromSpecWithBases() now raise MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84575
diff changeset
2525 PyErr_NoMemory();
76925
6b037a9eaba7 Remove tab characters
Antoine Pitrou <solipsis@pitrou.net>
parents: 76924
diff changeset
2526 goto fail;
84643
c676fc74d779 Issue #18408: type_new() and PyType_FromSpecWithBases() now raise MemoryError
Victor Stinner <victor.stinner@gmail.com>
parents: 84575
diff changeset
2527 }
67962
788eafaef7dc #11249: in PyType_FromSpec, copy tp_doc slot since it usually will point to a static string literal which should not be deallocated together with the type.
Georg Brandl <georg@python.org>
parents: 67877
diff changeset
2528 memcpy(tp_doc, slot->pfunc, len);
77655
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2529 type->tp_doc = tp_doc;
67962
788eafaef7dc #11249: in PyType_FromSpec, copy tp_doc slot since it usually will point to a static string literal which should not be deallocated together with the type.
Georg Brandl <georg@python.org>
parents: 67877
diff changeset
2530 }
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2531 }
77655
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2532 if (type->tp_dictoffset) {
76485
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2533 res->ht_cached_keys = _PyDict_NewKeysForClass();
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2534 }
77655
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2535 if (type->tp_dealloc == NULL) {
77628
1794308c1ea7 Issue #15142: Fix reference leak when deallocating instances of types created using PyType_FromSpec().
Antoine Pitrou <solipsis@pitrou.net>
parents: 76925
diff changeset
2536 /* It's a heap type, so needs the heap types' dealloc.
1794308c1ea7 Issue #15142: Fix reference leak when deallocating instances of types created using PyType_FromSpec().
Antoine Pitrou <solipsis@pitrou.net>
parents: 76925
diff changeset
2537 subtype_dealloc will call the base type's tp_dealloc, if
1794308c1ea7 Issue #15142: Fix reference leak when deallocating instances of types created using PyType_FromSpec().
Antoine Pitrou <solipsis@pitrou.net>
parents: 76925
diff changeset
2538 necessary. */
77655
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2539 type->tp_dealloc = subtype_dealloc;
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2540 }
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2541
7ce45e2625c3 Use struct member (ht_type) instead of casting pointers.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77651
diff changeset
2542 if (PyType_Ready(type) < 0)
74685
e858bb04f7e7 ready types returned from PyType_FromSpec
Benjamin Peterson <benjamin@python.org>
parents: 74684
diff changeset
2543 goto fail;
e858bb04f7e7 ready types returned from PyType_FromSpec
Benjamin Peterson <benjamin@python.org>
parents: 74684
diff changeset
2544
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2545 /* Set type.__module__ */
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2546 s = strrchr(spec->name, '.');
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2547 if (s != NULL)
84560
a2d6274e2fc8 typeobject.c: remove trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 84512
diff changeset
2548 _PyDict_SetItemId(type->tp_dict, &PyId___module__,
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2549 PyUnicode_FromStringAndSize(
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2550 spec->name, (Py_ssize_t)(s - spec->name)));
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2551
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2552 return (PyObject*)res;
67347
3bf4d9f1660a Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66664
diff changeset
2553
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2554 fail:
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2555 Py_DECREF(res);
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2556 return NULL;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2557 }
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2558
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2559 PyObject *
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2560 PyType_FromSpec(PyType_Spec *spec)
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2561 {
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2562 return PyType_FromSpecWithBases(spec, NULL);
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2563 }
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
2564
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65603
diff changeset
2565
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2566 /* 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
2567 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
2568 PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2569 _PyType_Lookup(PyTypeObject *type, PyObject *name)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2570 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2571 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2572 PyObject *mro, *res, *base, *dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2573 unsigned int h;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2574
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2575 if (MCACHE_CACHEABLE_NAME(name) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2576 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
2577 /* fast path */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2578 h = MCACHE_HASH_METHOD(type, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2579 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
2580 method_cache[h].name == name)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2581 return method_cache[h].value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2582 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2583
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2584 /* 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
2585 mro = type->tp_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2586
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2587 /* 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
2588 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
2589 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
2590 if (mro == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2591 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2592
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2593 res = NULL;
75497
21e245ed3747 Close #14199: _PyType_Lookup() and super_getattro() keep a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75484
diff changeset
2594 /* keep a strong reference to mro because type->tp_mro can be replaced
21e245ed3747 Close #14199: _PyType_Lookup() and super_getattro() keep a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75484
diff changeset
2595 during PyDict_GetItem(dict, name) */
21e245ed3747 Close #14199: _PyType_Lookup() and super_getattro() keep a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75484
diff changeset
2596 Py_INCREF(mro);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2597 assert(PyTuple_Check(mro));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2598 n = PyTuple_GET_SIZE(mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2599 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2600 base = PyTuple_GET_ITEM(mro, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2601 assert(PyType_Check(base));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2602 dict = ((PyTypeObject *)base)->tp_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2603 assert(dict && PyDict_Check(dict));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2604 res = PyDict_GetItem(dict, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2605 if (res != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2606 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2607 }
75497
21e245ed3747 Close #14199: _PyType_Lookup() and super_getattro() keep a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75484
diff changeset
2608 Py_DECREF(mro);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2609
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2610 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
2611 h = MCACHE_HASH_METHOD(type, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2612 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
2613 method_cache[h].value = res; /* borrowed */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2614 Py_INCREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2615 Py_DECREF(method_cache[h].name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2616 method_cache[h].name = name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2617 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2618 return res;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2619 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2620
85909
6aef095fdb30 Issue #18594: Fix the fast path for collections.Counter().
Raymond Hettinger <python@rcn.com>
parents: 83772
diff changeset
2621 PyObject *
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2622 _PyType_LookupId(PyTypeObject *type, struct _Py_Identifier *name)
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2623 {
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2624 PyObject *oname;
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2625 oname = _PyUnicode_FromId(name); /* borrowed */
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2626 if (oname == NULL)
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2627 return NULL;
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2628 return _PyType_Lookup(type, oname);
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2629 }
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
2630
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2631 /* This is similar to PyObject_GenericGetAttr(),
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2632 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
2633 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2634 type_getattro(PyTypeObject *type, PyObject *name)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2635 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2636 PyTypeObject *metatype = Py_TYPE(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2637 PyObject *meta_attribute, *attribute;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2638 descrgetfunc meta_get;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2639
75737
b7bad204b34f check to make sure the attribute is a string (#14334)
Benjamin Peterson <benjamin@python.org>
parents: 75482
diff changeset
2640 if (!PyUnicode_Check(name)) {
b7bad204b34f check to make sure the attribute is a string (#14334)
Benjamin Peterson <benjamin@python.org>
parents: 75482
diff changeset
2641 PyErr_Format(PyExc_TypeError,
b7bad204b34f check to make sure the attribute is a string (#14334)
Benjamin Peterson <benjamin@python.org>
parents: 75482
diff changeset
2642 "attribute name must be string, not '%.200s'",
b7bad204b34f check to make sure the attribute is a string (#14334)
Benjamin Peterson <benjamin@python.org>
parents: 75482
diff changeset
2643 name->ob_type->tp_name);
b7bad204b34f check to make sure the attribute is a string (#14334)
Benjamin Peterson <benjamin@python.org>
parents: 75482
diff changeset
2644 return NULL;
b7bad204b34f check to make sure the attribute is a string (#14334)
Benjamin Peterson <benjamin@python.org>
parents: 75482
diff changeset
2645 }
b7bad204b34f check to make sure the attribute is a string (#14334)
Benjamin Peterson <benjamin@python.org>
parents: 75482
diff changeset
2646
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2647 /* 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
2648 if (type->tp_dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2649 if (PyType_Ready(type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2650 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2651 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2652
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2653 /* No readable descriptor found yet */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2654 meta_get = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2655
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2656 /* 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
2657 meta_attribute = _PyType_Lookup(metatype, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2658
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2659 if (meta_attribute != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2660 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
2661
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2662 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
2663 /* 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
2664 * 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
2665 * 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
2666 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2667 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
2668 (PyObject *)metatype);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2669 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2670 Py_INCREF(meta_attribute);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2671 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2672
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2673 /* 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
2674 * type and its bases */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2675 attribute = _PyType_Lookup(type, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2676 if (attribute != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2677 /* Implement descriptor functionality, if any */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2678 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
2679
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2680 Py_XDECREF(meta_attribute);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2681
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2682 if (local_get != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2683 /* 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
2684 * 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
2685 return local_get(attribute, (PyObject *)NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2686 (PyObject *)type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2687 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2688
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2689 Py_INCREF(attribute);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2690 return attribute;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2691 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2692
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2693 /* 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
2694 * descriptor from the metatype, if any */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2695 if (meta_get != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2696 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2697 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
2698 (PyObject *)metatype);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2699 Py_DECREF(meta_attribute);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2700 return res;
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2703 /* 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
2704 if (meta_attribute != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2705 return meta_attribute;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2706 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2707
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2708 /* Give up */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2709 PyErr_Format(PyExc_AttributeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2710 "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
2711 type->tp_name, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2712 return NULL;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2713 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2714
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2715 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2716 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
2717 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2718 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
2719 PyErr_Format(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2720 PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2721 "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
2722 type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2723 return -1;
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 (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
2726 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2727 return update_slot(type, name);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2728 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2729
76581
a3beae842f13 decref cached keys on type deallocation (#13903)
Benjamin Peterson <benjamin@python.org>
parents: 76530
diff changeset
2730 extern void
a3beae842f13 decref cached keys on type deallocation (#13903)
Benjamin Peterson <benjamin@python.org>
parents: 76530
diff changeset
2731 _PyDictKeys_DecRef(PyDictKeysObject *keys);
a3beae842f13 decref cached keys on type deallocation (#13903)
Benjamin Peterson <benjamin@python.org>
parents: 76530
diff changeset
2732
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2733 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2734 type_dealloc(PyTypeObject *type)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2735 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2736 PyHeapTypeObject *et;
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2737 PyObject *tp, *val, *tb;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2738
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2739 /* 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
2740 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
2741 _PyObject_GC_UNTRACK(type);
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2742 PyErr_Fetch(&tp, &val, &tb);
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2743 remove_all_subclasses(type, type->tp_bases);
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2744 PyErr_Restore(tp, val, tb);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2745 PyObject_ClearWeakRefs((PyObject *)type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2746 et = (PyHeapTypeObject *)type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2747 Py_XDECREF(type->tp_base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2748 Py_XDECREF(type->tp_dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2749 Py_XDECREF(type->tp_bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2750 Py_XDECREF(type->tp_mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2751 Py_XDECREF(type->tp_cache);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2752 Py_XDECREF(type->tp_subclasses);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2753 /* 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
2754 * 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
2755 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2756 PyObject_Free((char *)type->tp_doc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2757 Py_XDECREF(et->ht_name);
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
2758 Py_XDECREF(et->ht_qualname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2759 Py_XDECREF(et->ht_slots);
76581
a3beae842f13 decref cached keys on type deallocation (#13903)
Benjamin Peterson <benjamin@python.org>
parents: 76530
diff changeset
2760 if (et->ht_cached_keys)
a3beae842f13 decref cached keys on type deallocation (#13903)
Benjamin Peterson <benjamin@python.org>
parents: 76530
diff changeset
2761 _PyDictKeys_DecRef(et->ht_cached_keys);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2762 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
2763 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2764
20315
7b41f7a2e528 Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents: 20296
diff changeset
2765 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
2766 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
2767 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2768 PyObject *list, *raw, *ref;
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2769 Py_ssize_t i;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2770
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2771 list = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2772 if (list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2773 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2774 raw = type->tp_subclasses;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2775 if (raw == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2776 return list;
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2777 assert(PyDict_CheckExact(raw));
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2778 i = 0;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2779 while (PyDict_Next(raw, &i, NULL, &ref)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2780 assert(PyWeakref_CheckRef(ref));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2781 ref = PyWeakref_GET_OBJECT(ref);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2782 if (ref != Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2783 if (PyList_Append(list, ref) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2784 Py_DECREF(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2785 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2786 }
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2789 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
2790 }
7b41f7a2e528 Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents: 20296
diff changeset
2791
42420
02c27177df79 Add a default __prepare__() method to 'type', so it can be called
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
2792 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
2793 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
2794 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2795 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
2796 }
02c27177df79 Add a default __prepare__() method to 'type', so it can be called
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
2797
72510
b534b56379cb Use the new Py_ARRAY_LENGTH macro
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72504
diff changeset
2798 /*
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2799 Merge the __dict__ of aclass into dict, and recursively also all
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2800 the __dict__s of aclass's base classes. The order of merging isn't
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2801 defined, as it's expected that only the final set of dict keys is
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2802 interesting.
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2803 Return 0 on success, -1 on error.
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2804 */
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2805
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2806 static int
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2807 merge_class_dict(PyObject *dict, PyObject *aclass)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2808 {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2809 PyObject *classdict;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2810 PyObject *bases;
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72913
diff changeset
2811 _Py_IDENTIFIER(__bases__);
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2812
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2813 assert(PyDict_Check(dict));
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2814 assert(aclass);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2815
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2816 /* Merge in the type's dict (if any). */
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
2817 classdict = _PyObject_GetAttrId(aclass, &PyId___dict__);
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2818 if (classdict == NULL)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2819 PyErr_Clear();
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2820 else {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2821 int status = PyDict_Update(dict, classdict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2822 Py_DECREF(classdict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2823 if (status < 0)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2824 return -1;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2825 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2826
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2827 /* Recursively merge in the base types' (if any) dicts. */
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
2828 bases = _PyObject_GetAttrId(aclass, &PyId___bases__);
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2829 if (bases == NULL)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2830 PyErr_Clear();
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2831 else {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2832 /* We have no guarantee that bases is a real tuple */
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2833 Py_ssize_t i, n;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2834 n = PySequence_Size(bases); /* This better be right */
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2835 if (n < 0)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2836 PyErr_Clear();
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2837 else {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2838 for (i = 0; i < n; i++) {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2839 int status;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2840 PyObject *base = PySequence_GetItem(bases, i);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2841 if (base == NULL) {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2842 Py_DECREF(bases);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2843 return -1;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2844 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2845 status = merge_class_dict(dict, base);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2846 Py_DECREF(base);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2847 if (status < 0) {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2848 Py_DECREF(bases);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2849 return -1;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2850 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2851 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2852 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2853 Py_DECREF(bases);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2854 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2855 return 0;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2856 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2857
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2858 /* __dir__ for type objects: returns __dict__ and __bases__.
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2859 We deliberately don't suck up its __class__, as methods belonging to the
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2860 metaclass would probably be more confusing than helpful.
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2861 */
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2862 static PyObject *
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2863 type_dir(PyObject *self, PyObject *args)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2864 {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2865 PyObject *result = NULL;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2866 PyObject *dict = PyDict_New();
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2867
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2868 if (dict != NULL && merge_class_dict(dict, self) == 0)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2869 result = PyDict_Keys(dict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2870
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2871 Py_XDECREF(dict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2872 return result;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2873 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2874
76530
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2875 static PyObject*
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2876 type_sizeof(PyObject *self, PyObject *args_unused)
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2877 {
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2878 Py_ssize_t size;
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2879 PyTypeObject *type = (PyTypeObject*)self;
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2880 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2881 PyHeapTypeObject* et = (PyHeapTypeObject*)type;
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2882 size = sizeof(PyHeapTypeObject);
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2883 if (et->ht_cached_keys)
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2884 size += _PyDict_KeysSize(et->ht_cached_keys);
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2885 }
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2886 else
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2887 size = sizeof(PyTypeObject);
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2888 return PyLong_FromSsize_t(size);
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2889 }
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2890
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2891 static PyMethodDef type_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2892 {"mro", (PyCFunction)mro_external, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2893 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
2894 {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2895 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
2896 {"__prepare__", (PyCFunction)type_prepare,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2897 METH_VARARGS | METH_KEYWORDS | METH_CLASS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2898 PyDoc_STR("__prepare__() -> dict\n"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2899 "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
2900 {"__instancecheck__", type___instancecheck__, METH_O,
70338
310b484ebd91 use '->' to indicate return values
Benjamin Peterson <benjamin@python.org>
parents: 68585
diff changeset
2901 PyDoc_STR("__instancecheck__() -> bool\ncheck if an object is an instance")},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2902 {"__subclasscheck__", type___subclasscheck__, METH_O,
70338
310b484ebd91 use '->' to indicate return values
Benjamin Peterson <benjamin@python.org>
parents: 68585
diff changeset
2903 PyDoc_STR("__subclasscheck__() -> bool\ncheck if a class is a subclass")},
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
2904 {"__dir__", type_dir, METH_NOARGS,
70342
6f078d80898f indicate return value on __dir__ methods
Benjamin Peterson <benjamin@python.org>
parents: 70341
diff changeset
2905 PyDoc_STR("__dir__() -> list\nspecialized __dir__ implementation for types")},
76530
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2906 {"__sizeof__", type_sizeof, METH_NOARGS,
b044e0568be2 Account for shared keys in type's __sizeof__ (#13903).
Martin v. Loewis <martin@v.loewis.de>
parents: 76519
diff changeset
2907 "__sizeof__() -> int\nreturn memory consumption of the type object"},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2908 {0}
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2909 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2910
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23830
diff changeset
2911 PyDoc_STRVAR(type_doc,
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
2912 "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
2913 "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
2914
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20204
diff changeset
2915 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
2916 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
2917 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2918 /* 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
2919 for heaptypes. */
77658
515747aa191f Replace assert() with a more informative fatal error.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77655
diff changeset
2920 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
515747aa191f Replace assert() with a more informative fatal error.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77655
diff changeset
2921 char msg[200];
515747aa191f Replace assert() with a more informative fatal error.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77655
diff changeset
2922 sprintf(msg, "type_traverse() called for non-heap type '%.100s'",
515747aa191f Replace assert() with a more informative fatal error.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77655
diff changeset
2923 type->tp_name);
515747aa191f Replace assert() with a more informative fatal error.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77655
diff changeset
2924 Py_FatalError(msg);
515747aa191f Replace assert() with a more informative fatal error.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77655
diff changeset
2925 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2926
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2927 Py_VISIT(type->tp_dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2928 Py_VISIT(type->tp_cache);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2929 Py_VISIT(type->tp_mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2930 Py_VISIT(type->tp_bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2931 Py_VISIT(type->tp_base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2932
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2933 /* 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
2934 ((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
2935 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
2936 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
2937
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2938 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
2939 }
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20204
diff changeset
2940
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20204
diff changeset
2941 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
2942 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
2943 {
76485
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2944 PyDictKeysObject *cached_keys;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2945 /* 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
2946 for heaptypes. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2947 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
2948
73978
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2949 /* We need to invalidate the method cache carefully before clearing
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2950 the dict, so that other objects caught in a reference cycle
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2951 don't start calling destroyed methods.
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2952
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2953 Otherwise, the only field we need to clear is tp_mro, which is
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2954 part of a hard cycle (its first element is the class itself) that
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2955 won't be broken otherwise (it's a tuple and tuples don't have a
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2956 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
2957 cleared, and here's why:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2958
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2959 tp_cache:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2960 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
2961
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2962 tp_bases, tp_base:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2963 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
2964 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
2965 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
2966
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2967 tp_subclasses:
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2968 A dict of weak references can't be part of a cycle; and
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
2969 dicts have their own tp_clear.
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2970
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2971 slots (in PyHeapTypeObject):
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2972 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
2973 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2974
73978
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2975 PyType_Modified(type);
76485
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2976 cached_keys = ((PyHeapTypeObject *)type)->ht_cached_keys;
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2977 if (cached_keys != NULL) {
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2978 ((PyHeapTypeObject *)type)->ht_cached_keys = NULL;
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2979 _PyDictKeys_DecRef(cached_keys);
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76060
diff changeset
2980 }
73978
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2981 if (type->tp_dict)
b196bcd7c34f Fix the fix for issue #12149: it was incorrect, although it had the side
Antoine Pitrou <solipsis@pitrou.net>
parents: 73500
diff changeset
2982 PyDict_Clear(type->tp_dict);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2983 Py_CLEAR(type->tp_mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2984
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2985 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
2986 }
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20204
diff changeset
2987
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20204
diff changeset
2988 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
2989 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
2990 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2991 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
2992 }
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20204
diff changeset
2993
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
2994 PyTypeObject PyType_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2995 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2996 "type", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2997 sizeof(PyHeapTypeObject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2998 sizeof(PyMemberDef), /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
2999 (destructor)type_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3000 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3001 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3002 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3003 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3004 (reprfunc)type_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3005 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3006 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3007 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3008 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3009 (ternaryfunc)type_call, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3010 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3011 (getattrofunc)type_getattro, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3012 (setattrofunc)type_setattro, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3013 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3014 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
3015 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
3016 type_doc, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3017 (traverseproc)type_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3018 (inquiry)type_clear, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3019 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3020 offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3021 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3022 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3023 type_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3024 type_members, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3025 type_getsets, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3026 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3027 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3028 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3029 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3030 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3031 type_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3032 0, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3033 type_new, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3034 PyObject_GC_Del, /* tp_free */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3035 (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
3036 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3037
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3038
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3039 /* 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
3040
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3041 /* 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
3042 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
3043
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3044 Consider the use cases:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3045
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3046 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
3047 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
3048 indicate there's a bug.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3049
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3050 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
3051 __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
3052 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
3053 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
3054 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
3055
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3056 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
3057 __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
3058 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
3059 complaining.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3060
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3061 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
3062 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
3063 arguments; ditto for __new__().
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3064
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3065 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
3066 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
3067 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
3068 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
3069 (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
3070 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
3071 __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
3072 (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
3073
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3074 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
3075 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
3076 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
3077 rules.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3078
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3079 */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3080
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3081 /* Forward */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3082 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3083 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
3084
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3085 static int
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3086 excess_args(PyObject *args, PyObject *kwds)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3087 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3088 return PyTuple_GET_SIZE(args) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3089 (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
3090 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3091
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3092 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3093 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
3094 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3095 int err = 0;
75773
25b71858cb14 make extra arguments to object.__init__/__new__ to errors in most cases (finishes #1683368)
Benjamin Peterson <benjamin@python.org>
parents: 75761
diff changeset
3096 PyTypeObject *type = Py_TYPE(self);
25b71858cb14 make extra arguments to object.__init__/__new__ to errors in most cases (finishes #1683368)
Benjamin Peterson <benjamin@python.org>
parents: 75761
diff changeset
3097 if (excess_args(args, kwds) &&
25b71858cb14 make extra arguments to object.__init__/__new__ to errors in most cases (finishes #1683368)
Benjamin Peterson <benjamin@python.org>
parents: 75761
diff changeset
3098 (type->tp_new == object_new || type->tp_init != object_init)) {
25b71858cb14 make extra arguments to object.__init__/__new__ to errors in most cases (finishes #1683368)
Benjamin Peterson <benjamin@python.org>
parents: 75761
diff changeset
3099 PyErr_SetString(PyExc_TypeError, "object.__init__() takes no parameters");
25b71858cb14 make extra arguments to object.__init__/__new__ to errors in most cases (finishes #1683368)
Benjamin Peterson <benjamin@python.org>
parents: 75761
diff changeset
3100 err = -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3101 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3102 return err;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3103 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3104
27866
bbbba0ee61fb SF patch #685738 by Michael Stone.
Guido van Rossum <guido@python.org>
parents: 27831
diff changeset
3105 static PyObject *
bbbba0ee61fb SF patch #685738 by Michael Stone.
Guido van Rossum <guido@python.org>
parents: 27831
diff changeset
3106 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
3107 {
75773
25b71858cb14 make extra arguments to object.__init__/__new__ to errors in most cases (finishes #1683368)
Benjamin Peterson <benjamin@python.org>
parents: 75761
diff changeset
3108 if (excess_args(args, kwds) &&
25b71858cb14 make extra arguments to object.__init__/__new__ to errors in most cases (finishes #1683368)
Benjamin Peterson <benjamin@python.org>
parents: 75761
diff changeset
3109 (type->tp_init == object_init || type->tp_new != object_new)) {
82260
0e438442fddf #7963: fix error message when 'object' called with arguments.
R David Murray <rdmurray@bitdance.com>
parents: 80078 82259
diff changeset
3110 PyErr_SetString(PyExc_TypeError, "object() takes no parameters");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3111 return NULL;
75773
25b71858cb14 make extra arguments to object.__init__/__new__ to errors in most cases (finishes #1683368)
Benjamin Peterson <benjamin@python.org>
parents: 75761
diff changeset
3112 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3113
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3114 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
3115 PyObject *abstract_methods = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3116 PyObject *builtins;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3117 PyObject *sorted;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3118 PyObject *sorted_methods = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3119 PyObject *joined = NULL;
75761
1bb05dd557b1 simply this slightly
Benjamin Peterson <benjamin@python.org>
parents: 75738
diff changeset
3120 PyObject *comma;
1bb05dd557b1 simply this slightly
Benjamin Peterson <benjamin@python.org>
parents: 75738
diff changeset
3121 _Py_static_string(comma_id, ", ");
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3122 _Py_IDENTIFIER(sorted);
61467
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 /* Compute ", ".join(sorted(type.__abstractmethods__))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3125 into joined. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3126 abstract_methods = type_abstractmethods(type, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3127 if (abstract_methods == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3128 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3129 builtins = PyEval_GetBuiltins();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3130 if (builtins == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3131 goto error;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3132 sorted = _PyDict_GetItemId(builtins, &PyId_sorted);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3133 if (sorted == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3134 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3135 sorted_methods = PyObject_CallFunctionObjArgs(sorted,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3136 abstract_methods,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3137 NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3138 if (sorted_methods == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3139 goto error;
75761
1bb05dd557b1 simply this slightly
Benjamin Peterson <benjamin@python.org>
parents: 75738
diff changeset
3140 comma = _PyUnicode_FromId(&comma_id);
1bb05dd557b1 simply this slightly
Benjamin Peterson <benjamin@python.org>
parents: 75738
diff changeset
3141 if (comma == NULL)
1bb05dd557b1 simply this slightly
Benjamin Peterson <benjamin@python.org>
parents: 75738
diff changeset
3142 goto error;
1bb05dd557b1 simply this slightly
Benjamin Peterson <benjamin@python.org>
parents: 75738
diff changeset
3143 joined = PyUnicode_Join(comma, sorted_methods);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3144 if (joined == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3145 goto error;
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 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3148 "Can't instantiate abstract class %s "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3149 "with abstract methods %U",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3150 type->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3151 joined);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3152 error:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3153 Py_XDECREF(joined);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3154 Py_XDECREF(sorted_methods);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3155 Py_XDECREF(abstract_methods);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3156 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3157 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3158 return type->tp_alloc(type, 0);
27866
bbbba0ee61fb SF patch #685738 by Michael Stone.
Guido van Rossum <guido@python.org>
parents: 27831
diff changeset
3159 }
bbbba0ee61fb SF patch #685738 by Michael Stone.
Guido van Rossum <guido@python.org>
parents: 27831
diff changeset
3160
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3161 static void
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3162 object_dealloc(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3163 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3164 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
3165 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3166
19194
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
3167 static PyObject *
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
3168 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
3169 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3170 PyTypeObject *type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3171 PyObject *mod, *name, *rtn;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3172
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3173 type = Py_TYPE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3174 mod = type_module(type, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3175 if (mod == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3176 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3177 else if (!PyUnicode_Check(mod)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3178 Py_DECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3179 mod = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3180 }
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73501
diff changeset
3181 name = type_qualname(type, NULL);
78964
302561c9387a Fixed memory leak in error branch of object_repr which may leak a reference to mod when type_name returns NULL. CID 715371
Christian Heimes <christian@cheimes.de>
parents: 78940
diff changeset
3182 if (name == NULL) {
302561c9387a Fixed memory leak in error branch of object_repr which may leak a reference to mod when type_name returns NULL. CID 715371
Christian Heimes <christian@cheimes.de>
parents: 78940
diff changeset
3183 Py_XDECREF(mod);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3184 return NULL;
78964
302561c9387a Fixed memory leak in error branch of object_repr which may leak a reference to mod when type_name returns NULL. CID 715371
Christian Heimes <christian@cheimes.de>
parents: 78940
diff changeset
3185 }
86999
01c4a0af73cf Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents: 86994
diff changeset
3186 if (mod != NULL && _PyUnicode_CompareWithId(mod, &PyId_builtins))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3187 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
3188 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3189 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
3190 type->tp_name, self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3191 Py_XDECREF(mod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3192 Py_DECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3193 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
3194 }
7e9f5c59e9f2 Make dynamic types work as intended. Or at least more so.
Guido van Rossum <guido@python.org>
parents: 19192
diff changeset
3195
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
3196 static PyObject *
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
3197 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
3198 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3199 unaryfunc f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3200
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3201 f = Py_TYPE(self)->tp_repr;
76518
971865f12377 don't use a slot wrapper from a different special method (closes #14658)
Benjamin Peterson <benjamin@python.org>
parents: 76059
diff changeset
3202 if (f == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3203 f = object_repr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3204 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
3205 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
3206
20075
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3207 static PyObject *
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39624
diff changeset
3208 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
3209 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3210 PyObject *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 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3213
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3214 case Py_EQ:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3215 /* 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
3216 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
3217 comparison. See issue #1393. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3218 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
3219 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3220 break;
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 case Py_NE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3223 /* By default, != returns the opposite of ==,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3224 unless the latter returns NotImplemented. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3225 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
3226 if (res != NULL && res != Py_NotImplemented) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3227 int ok = PyObject_IsTrue(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3228 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3229 if (ok < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3230 res = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3231 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3232 if (ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3233 res = Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3234 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3235 res = Py_True;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3236 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3237 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3238 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3239 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3240
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3241 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3242 res = Py_NotImplemented;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3243 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3244 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3245 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3246
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3247 return res;
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39624
diff changeset
3248 }
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39624
diff changeset
3249
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39624
diff changeset
3250 static PyObject *
20075
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3251 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
3252 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3253 Py_INCREF(Py_TYPE(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3254 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
3255 }
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3256
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3257 static int
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3258 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
3259 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3260 return a == b ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3261 (a != NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3262 b != NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3263 a->tp_basicsize == b->tp_basicsize &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3264 a->tp_itemsize == b->tp_itemsize &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3265 a->tp_dictoffset == b->tp_dictoffset &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3266 a->tp_weaklistoffset == b->tp_weaklistoffset &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3267 ((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
3268 (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
3269 }
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3270
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3271 static int
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3272 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
3273 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3274 PyTypeObject *base = a->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3275 Py_ssize_t size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3276 PyObject *slots_a, *slots_b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3277
67647
c59cea218547 Merged revisions 88063 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 67558
diff changeset
3278 assert(base == b->tp_base);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3279 size = base->tp_basicsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3280 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
3281 size += sizeof(PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3282 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
3283 size += sizeof(PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3284
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3285 /* Check slots compliance */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3286 slots_a = ((PyHeapTypeObject *)a)->ht_slots;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3287 slots_b = ((PyHeapTypeObject *)b)->ht_slots;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3288 if (slots_a && slots_b) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3289 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
3290 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3291 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
3292 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3293 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
3294 }
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3295
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3296 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
3297 compatible_for_assignment(PyTypeObject* oldto, PyTypeObject* newto, char* attr)
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
3298 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3299 PyTypeObject *newbase, *oldbase;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3300
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3301 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
3302 newto->tp_free != oldto->tp_free)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3303 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3304 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3305 "%s assignment: "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3306 "'%s' deallocator differs from '%s'",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3307 attr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3308 newto->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3309 oldto->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3310 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3311 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3312 newbase = newto;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3313 oldbase = oldto;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3314 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
3315 newbase = newbase->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3316 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
3317 oldbase = oldbase->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3318 if (newbase != oldbase &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3319 (newbase->tp_base != oldbase->tp_base ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3320 !same_slots_added(newbase, oldbase))) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3321 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3322 "%s assignment: "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3323 "'%s' object layout differs from '%s'",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3324 attr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3325 newto->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3326 oldto->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3327 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3328 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3329
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3330 return 1;
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
3331 }
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
3332
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
3333 static int
20075
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3334 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
3335 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3336 PyTypeObject *oldto = Py_TYPE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3337 PyTypeObject *newto;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3338
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3339 if (value == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3340 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3341 "can't delete __class__ attribute");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3342 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3343 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3344 if (!PyType_Check(value)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3345 PyErr_Format(PyExc_TypeError,
73949
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
3346 "__class__ must be set to a class, not '%s' object",
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3347 Py_TYPE(value)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3348 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3349 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3350 newto = (PyTypeObject *)value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3351 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
3352 !(oldto->tp_flags & Py_TPFLAGS_HEAPTYPE))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3353 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3354 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3355 "__class__ assignment: only for heap types");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3356 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3357 }
84725
a65856044ad4 Issue #18327: Fix argument order in call to compatible_for_assignment(oldto, newto, attr).
Christian Heimes <christian@cheimes.de>
parents: 84706
diff changeset
3358 if (compatible_for_assignment(oldto, newto, "__class__")) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3359 Py_INCREF(newto);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3360 Py_TYPE(self) = newto;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3361 Py_DECREF(oldto);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3362 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3363 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3364 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3365 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3366 }
20075
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3367 }
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3368
aae5cf7e5861 Make __class__ assignment possible, when the object structures are the
Guido van Rossum <guido@python.org>
parents: 20063
diff changeset
3369 static PyGetSetDef object_getsets[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3370 {"__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
3371 PyDoc_STR("the object's class")},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3372 {0}
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3373 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
3374
28016
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3375
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3376 /* 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
3377 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
3378 - pickle protocols < 2
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3379 - 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
3380 - 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
3381 */
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3382
20084
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
3383 static PyObject *
46867
dd5513b472dc Rename copy_reg module to copyreg.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 46644
diff changeset
3384 import_copyreg(void)
dd5513b472dc Rename copy_reg module to copyreg.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 46644
diff changeset
3385 {
87652
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3386 PyObject *copyreg_str;
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3387 PyObject *copyreg_module;
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3388 PyInterpreterState *interp = PyThreadState_GET()->interp;
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3389 _Py_IDENTIFIER(copyreg);
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3390
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3391 copyreg_str = _PyUnicode_FromId(&PyId_copyreg);
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3392 if (copyreg_str == NULL) {
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3393 return NULL;
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3394 }
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3395 /* Try to fetch cached copy of copyreg from sys.modules first in an
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3396 attempt to avoid the import overhead. Previously this was implemented
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3397 by storing a reference to the cached module in a static variable, but
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3398 this broke when multiple embeded interpreters were in use (see issue
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3399 #17408 and #19088). */
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3400 copyreg_module = PyDict_GetItemWithError(interp->modules, copyreg_str);
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3401 if (copyreg_module != NULL) {
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3402 Py_INCREF(copyreg_module);
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3403 return copyreg_module;
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3404 }
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3405 if (PyErr_Occurred()) {
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3406 return NULL;
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3407 }
96d1207d33d0 Issue #19088: Fix incorrect caching of the copyreg module.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 85909
diff changeset
3408 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
3409 }
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3410
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3411 Py_LOCAL(PyObject *)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3412 _PyType_GetSlotNames(PyTypeObject *cls)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3413 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3414 PyObject *copyreg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3415 PyObject *slotnames;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3416 _Py_IDENTIFIER(__slotnames__);
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72913
diff changeset
3417 _Py_IDENTIFIER(_slotnames);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3418
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3419 assert(PyType_Check(cls));
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3420
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3421 /* Get the slot names from the cache in the class if possible. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3422 slotnames = _PyDict_GetItemIdWithError(cls->tp_dict, &PyId___slotnames__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3423 if (slotnames != NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3424 if (slotnames != Py_None && !PyList_Check(slotnames)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3425 PyErr_Format(PyExc_TypeError,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3426 "%.200s.__slotnames__ should be a list or None, "
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3427 "not %.200s",
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3428 cls->tp_name, Py_TYPE(slotnames)->tp_name);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3429 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3430 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3431 Py_INCREF(slotnames);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3432 return slotnames;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3433 }
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3434 else {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3435 if (PyErr_Occurred()) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3436 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3437 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3438 /* The class does not have the slot names cached yet. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3439 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3440
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3441 copyreg = import_copyreg();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3442 if (copyreg == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3443 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3444
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3445 /* Use _slotnames function from the copyreg module to find the slots
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3446 by this class and its bases. This function will cache the result
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3447 in __slotnames__. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3448 slotnames = _PyObject_CallMethodIdObjArgs(copyreg, &PyId__slotnames,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3449 cls, NULL);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3450 Py_DECREF(copyreg);
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3451 if (slotnames == NULL)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3452 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3453
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3454 if (slotnames != Py_None && !PyList_Check(slotnames)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3455 PyErr_SetString(PyExc_TypeError,
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3456 "copyreg._slotnames didn't return a list or None");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3457 Py_DECREF(slotnames);
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3458 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3459 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3460
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3461 return slotnames;
28016
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3462 }
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3463
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3464 Py_LOCAL(PyObject *)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3465 _PyObject_GetState(PyObject *obj)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3466 {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3467 PyObject *state;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3468 PyObject *getstate;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3469 _Py_IDENTIFIER(__getstate__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3470
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3471 getstate = _PyObject_GetAttrId(obj, &PyId___getstate__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3472 if (getstate == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3473 PyObject *slotnames;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3474
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3475 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3476 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3477 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3478 PyErr_Clear();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3479
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3480 {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3481 PyObject **dict;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3482 dict = _PyObject_GetDictPtr(obj);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3483 /* It is possible that the object's dict is not initialized
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3484 yet. In this case, we will return None for the state.
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3485 We also return None if the dict is empty to make the behavior
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3486 consistent regardless whether the dict was initialized or not.
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3487 This make unit testing easier. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3488 if (dict != NULL && *dict != NULL && PyDict_Size(*dict) > 0) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3489 state = *dict;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3490 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3491 else {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3492 state = Py_None;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3493 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3494 Py_INCREF(state);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3495 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3496
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3497 slotnames = _PyType_GetSlotNames(Py_TYPE(obj));
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3498 if (slotnames == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3499 Py_DECREF(state);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3500 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3501 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3502
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3503 assert(slotnames == Py_None || PyList_Check(slotnames));
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3504 if (slotnames != Py_None && Py_SIZE(slotnames) > 0) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3505 PyObject *slots;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3506 Py_ssize_t slotnames_size, i;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3507
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3508 slots = PyDict_New();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3509 if (slots == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3510 Py_DECREF(slotnames);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3511 Py_DECREF(state);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3512 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3513 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3514
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3515 slotnames_size = Py_SIZE(slotnames);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3516 for (i = 0; i < slotnames_size; i++) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3517 PyObject *name, *value;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3518
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3519 name = PyList_GET_ITEM(slotnames, i);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3520 value = PyObject_GetAttr(obj, name);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3521 if (value == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3522 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3523 goto error;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3524 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3525 /* It is not an error if the attribute is not present. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3526 PyErr_Clear();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3527 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3528 else {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3529 int err = PyDict_SetItem(slots, name, value);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3530 Py_DECREF(value);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3531 if (err) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3532 goto error;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3533 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3534 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3535
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3536 /* The list is stored on the class so it may mutates while we
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3537 iterate over it */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3538 if (slotnames_size != Py_SIZE(slotnames)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3539 PyErr_Format(PyExc_RuntimeError,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3540 "__slotsname__ changed size during iteration");
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3541 goto error;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3542 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3543
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3544 /* We handle errors within the loop here. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3545 if (0) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3546 error:
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3547 Py_DECREF(slotnames);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3548 Py_DECREF(slots);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3549 Py_DECREF(state);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3550 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3551 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3552 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3553
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3554 /* If we found some slot attributes, pack them in a tuple along
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3555 the orginal attribute dictionary. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3556 if (PyDict_Size(slots) > 0) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3557 PyObject *state2;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3558
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3559 state2 = PyTuple_Pack(2, state, slots);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3560 Py_DECREF(state);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3561 if (state2 == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3562 Py_DECREF(slotnames);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3563 Py_DECREF(slots);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3564 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3565 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3566 state = state2;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3567 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3568 Py_DECREF(slots);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3569 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3570 Py_DECREF(slotnames);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3571 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3572 else { /* getstate != NULL */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3573 state = PyObject_CallObject(getstate, NULL);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3574 Py_DECREF(getstate);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3575 if (state == NULL)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3576 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3577 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3578
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3579 return state;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3580 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3581
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3582 Py_LOCAL(int)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3583 _PyObject_GetNewArguments(PyObject *obj, PyObject **args, PyObject **kwargs)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3584 {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3585 PyObject *getnewargs, *getnewargs_ex;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3586 _Py_IDENTIFIER(__getnewargs_ex__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3587 _Py_IDENTIFIER(__getnewargs__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3588
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3589 if (args == NULL || kwargs == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3590 PyErr_BadInternalCall();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3591 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3592 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3593
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3594 /* We first attempt to fetch the arguments for __new__ by calling
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3595 __getnewargs_ex__ on the object. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3596 getnewargs_ex = _PyObject_GetAttrId(obj, &PyId___getnewargs_ex__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3597 if (getnewargs_ex != NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3598 PyObject *newargs = PyObject_CallObject(getnewargs_ex, NULL);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3599 Py_DECREF(getnewargs_ex);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3600 if (newargs == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3601 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3602 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3603 if (!PyTuple_Check(newargs)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3604 PyErr_Format(PyExc_TypeError,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3605 "__getnewargs_ex__ should return a tuple, "
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3606 "not '%.200s'", Py_TYPE(newargs)->tp_name);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3607 Py_DECREF(newargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3608 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3609 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3610 if (Py_SIZE(newargs) != 2) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3611 PyErr_Format(PyExc_ValueError,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3612 "__getnewargs_ex__ should return a tuple of "
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3613 "length 2, not %zd", Py_SIZE(newargs));
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3614 Py_DECREF(newargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3615 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3616 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3617 *args = PyTuple_GET_ITEM(newargs, 0);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3618 Py_INCREF(*args);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3619 *kwargs = PyTuple_GET_ITEM(newargs, 1);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3620 Py_INCREF(*kwargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3621 Py_DECREF(newargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3622
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3623 /* XXX We should perhaps allow None to be passed here. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3624 if (!PyTuple_Check(*args)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3625 PyErr_Format(PyExc_TypeError,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3626 "first item of the tuple returned by "
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3627 "__getnewargs_ex__ must be a tuple, not '%.200s'",
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3628 Py_TYPE(*args)->tp_name);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3629 Py_CLEAR(*args);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3630 Py_CLEAR(*kwargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3631 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3632 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3633 if (!PyDict_Check(*kwargs)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3634 PyErr_Format(PyExc_TypeError,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3635 "second item of the tuple returned by "
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3636 "__getnewargs_ex__ must be a dict, not '%.200s'",
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3637 Py_TYPE(*kwargs)->tp_name);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3638 Py_CLEAR(*args);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3639 Py_CLEAR(*kwargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3640 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3641 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3642 return 0;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3643 } else {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3644 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3645 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3646 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3647 PyErr_Clear();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3648 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3649
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3650 /* The object does not have __getnewargs_ex__ so we fallback on using
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3651 __getnewargs__ instead. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3652 getnewargs = _PyObject_GetAttrId(obj, &PyId___getnewargs__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3653 if (getnewargs != NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3654 *args = PyObject_CallObject(getnewargs, NULL);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3655 Py_DECREF(getnewargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3656 if (*args == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3657 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3658 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3659 if (!PyTuple_Check(*args)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3660 PyErr_Format(PyExc_TypeError,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3661 "__getnewargs__ should return a tuple, "
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3662 "not '%.200s'", Py_TYPE(*args)->tp_name);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3663 Py_CLEAR(*args);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3664 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3665 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3666 *kwargs = NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3667 return 0;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3668 } else {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3669 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3670 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3671 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3672 PyErr_Clear();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3673 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3674
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3675 /* The object does not have __getnewargs_ex__ and __getnewargs__. This may
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3676 means __new__ does not takes any arguments on this object, or that the
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3677 object does not implement the reduce protocol for pickling or
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3678 copying. */
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3679 *args = NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3680 *kwargs = NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3681 return 0;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3682 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3683
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3684 Py_LOCAL(int)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3685 _PyObject_GetItemsIter(PyObject *obj, PyObject **listitems,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3686 PyObject **dictitems)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3687 {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3688 if (listitems == NULL || dictitems == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3689 PyErr_BadInternalCall();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3690 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3691 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3692
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3693 if (!PyList_Check(obj)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3694 *listitems = Py_None;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3695 Py_INCREF(*listitems);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3696 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3697 else {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3698 *listitems = PyObject_GetIter(obj);
87452
3e16c8c34e69 Issue #17810: Fixed NULL check in _PyObject_GetItemsIter()
Christian Heimes <christian@cheimes.de>
parents: 87438
diff changeset
3699 if (*listitems == NULL)
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3700 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3701 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3702
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3703 if (!PyDict_Check(obj)) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3704 *dictitems = Py_None;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3705 Py_INCREF(*dictitems);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3706 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3707 else {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3708 PyObject *items;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3709 _Py_IDENTIFIER(items);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3710
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3711 items = _PyObject_CallMethodIdObjArgs(obj, &PyId_items, NULL);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3712 if (items == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3713 Py_CLEAR(*listitems);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3714 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3715 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3716 *dictitems = PyObject_GetIter(items);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3717 Py_DECREF(items);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3718 if (*dictitems == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3719 Py_CLEAR(*listitems);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3720 return -1;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3721 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3722 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3723
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3724 assert(*listitems != NULL && *dictitems != NULL);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3725
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3726 return 0;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3727 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3728
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3729 static PyObject *
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3730 reduce_4(PyObject *obj)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3731 {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3732 PyObject *args = NULL, *kwargs = NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3733 PyObject *copyreg;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3734 PyObject *newobj, *newargs, *state, *listitems, *dictitems;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3735 PyObject *result;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3736 _Py_IDENTIFIER(__newobj_ex__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3737
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3738 if (_PyObject_GetNewArguments(obj, &args, &kwargs) < 0) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3739 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3740 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3741 if (args == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3742 args = PyTuple_New(0);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3743 if (args == NULL)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3744 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3745 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3746 if (kwargs == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3747 kwargs = PyDict_New();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3748 if (kwargs == NULL)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3749 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3750 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3751
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3752 copyreg = import_copyreg();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3753 if (copyreg == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3754 Py_DECREF(args);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3755 Py_DECREF(kwargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3756 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3757 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3758 newobj = _PyObject_GetAttrId(copyreg, &PyId___newobj_ex__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3759 Py_DECREF(copyreg);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3760 if (newobj == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3761 Py_DECREF(args);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3762 Py_DECREF(kwargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3763 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3764 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3765 newargs = PyTuple_Pack(3, Py_TYPE(obj), args, kwargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3766 Py_DECREF(args);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3767 Py_DECREF(kwargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3768 if (newargs == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3769 Py_DECREF(newobj);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3770 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3771 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3772 state = _PyObject_GetState(obj);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3773 if (state == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3774 Py_DECREF(newobj);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3775 Py_DECREF(newargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3776 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3777 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3778 if (_PyObject_GetItemsIter(obj, &listitems, &dictitems) < 0) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3779 Py_DECREF(newobj);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3780 Py_DECREF(newargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3781 Py_DECREF(state);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3782 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3783 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3784
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3785 result = PyTuple_Pack(5, newobj, newargs, state, listitems, dictitems);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3786 Py_DECREF(newobj);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3787 Py_DECREF(newargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3788 Py_DECREF(state);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3789 Py_DECREF(listitems);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3790 Py_DECREF(dictitems);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3791 return result;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3792 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3793
28016
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3794 static PyObject *
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3795 reduce_2(PyObject *obj)
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3796 {
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3797 PyObject *cls;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3798 PyObject *args = NULL, *args2 = NULL, *kwargs = NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3799 PyObject *state = NULL, *listitems = NULL, *dictitems = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3800 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
3801 Py_ssize_t i, n;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3802 _Py_IDENTIFIER(__newobj__);
68383
ff0220c9d213 Issue #9935: Speed up pickling of instances of user-defined classes.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
3803
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3804 if (_PyObject_GetNewArguments(obj, &args, &kwargs) < 0) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3805 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3806 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3807 if (args == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3808 assert(kwargs == NULL);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3809 args = PyTuple_New(0);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3810 if (args == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3811 return NULL;
61467
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 }
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3814 else if (kwargs != NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3815 if (PyDict_Size(kwargs) > 0) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3816 PyErr_SetString(PyExc_ValueError,
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3817 "must use protocol 4 or greater to copy this "
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3818 "object; since __getnewargs_ex__ returned "
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3819 "keyword arguments.");
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3820 Py_DECREF(args);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3821 Py_DECREF(kwargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3822 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3823 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3824 Py_CLEAR(kwargs);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3825 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3826
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3827 state = _PyObject_GetState(obj);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3828 if (state == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3829 goto end;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3830
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3831 if (_PyObject_GetItemsIter(obj, &listitems, &dictitems) < 0)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3832 goto end;
61467
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 copyreg = import_copyreg();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3835 if (copyreg == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3836 goto end;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3837 newobj = _PyObject_GetAttrId(copyreg, &PyId___newobj__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3838 if (newobj == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3839 goto end;
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 n = PyTuple_GET_SIZE(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3842 args2 = PyTuple_New(n+1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3843 if (args2 == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3844 goto end;
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3845 cls = (PyObject *) Py_TYPE(obj);
68383
ff0220c9d213 Issue #9935: Speed up pickling of instances of user-defined classes.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
3846 Py_INCREF(cls);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3847 PyTuple_SET_ITEM(args2, 0, cls);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3848 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3849 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
3850 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3851 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
3852 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3853
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3854 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
3855
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3856 end:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3857 Py_XDECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3858 Py_XDECREF(args2);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3859 Py_XDECREF(state);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3860 Py_XDECREF(listitems);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3861 Py_XDECREF(dictitems);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3862 Py_XDECREF(copyreg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3863 Py_XDECREF(newobj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3864 return res;
28016
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3865 }
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3866
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3867 /*
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3868 * 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
3869 * were implemented in the same function:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3870 * - 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
3871 * 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
3872 * 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
3873 * - 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
3874 * __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
3875 * and eventual segfault.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3876 *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3877 * 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
3878 * 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
3879 * 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
3880 * function.
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3881 */
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3882 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3883 _common_reduce(PyObject *self, int proto)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3884 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3885 PyObject *copyreg, *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3886
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3887 if (proto >= 4)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3888 return reduce_4(self);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 87072
diff changeset
3889 else if (proto >= 2)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3890 return reduce_2(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3891
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3892 copyreg = import_copyreg();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3893 if (!copyreg)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3894 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3895
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3896 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
3897 Py_DECREF(copyreg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3898
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3899 return res;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3900 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3901
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3902 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3903 object_reduce(PyObject *self, PyObject *args)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3904 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3905 int proto = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3906
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3907 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
3908 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3909
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3910 return _common_reduce(self, proto);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3911 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41501
diff changeset
3912
28016
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3913 static PyObject *
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
3914 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
3915 {
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3916 static PyObject *objreduce;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3917 PyObject *reduce, *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3918 int proto = 0;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3919 _Py_IDENTIFIER(__reduce__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3920
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3921 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
3922 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3923
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3924 if (objreduce == NULL) {
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3925 objreduce = _PyDict_GetItemId(PyBaseObject_Type.tp_dict,
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3926 &PyId___reduce__);
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3927 if (objreduce == NULL)
68383
ff0220c9d213 Issue #9935: Speed up pickling of instances of user-defined classes.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
3928 return NULL;
ff0220c9d213 Issue #9935: Speed up pickling of instances of user-defined classes.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
3929 }
ff0220c9d213 Issue #9935: Speed up pickling of instances of user-defined classes.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
3930
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3931 reduce = _PyObject_GetAttrId(self, &PyId___reduce__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3932 if (reduce == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3933 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3934 else {
68383
ff0220c9d213 Issue #9935: Speed up pickling of instances of user-defined classes.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
3935 PyObject *cls, *clsreduce;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3936 int override;
68383
ff0220c9d213 Issue #9935: Speed up pickling of instances of user-defined classes.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
3937
ff0220c9d213 Issue #9935: Speed up pickling of instances of user-defined classes.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
3938 cls = (PyObject *) Py_TYPE(self);
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
3939 clsreduce = _PyObject_GetAttrId(cls, &PyId___reduce__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3940 if (clsreduce == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3941 Py_DECREF(reduce);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3942 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3943 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3944 override = (clsreduce != objreduce);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3945 Py_DECREF(clsreduce);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3946 if (override) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3947 res = PyObject_CallObject(reduce, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3948 Py_DECREF(reduce);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3949 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3950 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3951 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3952 Py_DECREF(reduce);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3953 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3954
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3955 return _common_reduce(self, proto);
20084
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
3956 }
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
3957
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
3958 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
3959 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
3960 {
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 71357
diff changeset
3961 Py_RETURN_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
3962 }
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
3963
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
3964 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
3965 "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
3966 "\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
3967 "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
3968 "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
3969 "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
3970 "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
3971
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
3972 /*
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
3973 from PEP 3101, this code implements:
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
3974
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
3975 class object:
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
3976 def __format__(self, format_spec):
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3977 return format(str(self), format_spec)
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
3978 */
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
3979 static PyObject *
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
3980 object_format(PyObject *self, PyObject *args)
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
3981 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3982 PyObject *format_spec;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3983 PyObject *self_as_str = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3984 PyObject *result = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3985
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3986 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
3987 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3988
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3989 self_as_str = PyObject_Str(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
3990 if (self_as_str != NULL) {
64724
9f55faaa3193 Issue 7994: Make object.__format__() raise a PendingDeprecationWarning
Eric Smith <eric@trueblade.com>
parents: 64283
diff changeset
3991 /* Issue 7994: If we're converting to a string, we
68399
ee259a4f3eee Issue 9856: Change object.__format__ with a non-empty format string from a PendingDeprecationWarning to a DeprecationWarning.
Eric V. Smith <eric@trueblade.com>
parents: 68383
diff changeset
3992 should reject format specifications */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71895
diff changeset
3993 if (PyUnicode_GET_LENGTH(format_spec) > 0) {
80991
d91c14788729 Issue #9856: Replace deprecation warinigs to raising TypeError in object.__format__
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80079
diff changeset
3994 PyErr_SetString(PyExc_TypeError,
68399
ee259a4f3eee Issue 9856: Change object.__format__ with a non-empty format string from a PendingDeprecationWarning to a DeprecationWarning.
Eric V. Smith <eric@trueblade.com>
parents: 68383
diff changeset
3995 "non-empty format string passed to object.__format__");
80991
d91c14788729 Issue #9856: Replace deprecation warinigs to raising TypeError in object.__format__
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80079
diff changeset
3996 goto done;
68399
ee259a4f3eee Issue 9856: Change object.__format__ with a non-empty format string from a PendingDeprecationWarning to a DeprecationWarning.
Eric V. Smith <eric@trueblade.com>
parents: 68383
diff changeset
3997 }
ee259a4f3eee Issue 9856: Change object.__format__ with a non-empty format string from a PendingDeprecationWarning to a DeprecationWarning.
Eric V. Smith <eric@trueblade.com>
parents: 68383
diff changeset
3998
ee259a4f3eee Issue 9856: Change object.__format__ with a non-empty format string from a PendingDeprecationWarning to a DeprecationWarning.
Eric V. Smith <eric@trueblade.com>
parents: 68383
diff changeset
3999 result = PyObject_Format(self_as_str, format_spec);
64724
9f55faaa3193 Issue 7994: Make object.__format__() raise a PendingDeprecationWarning
Eric Smith <eric@trueblade.com>
parents: 64283
diff changeset
4000 }
9f55faaa3193 Issue 7994: Make object.__format__() raise a PendingDeprecationWarning
Eric Smith <eric@trueblade.com>
parents: 64283
diff changeset
4001
9f55faaa3193 Issue 7994: Make object.__format__() raise a PendingDeprecationWarning
Eric Smith <eric@trueblade.com>
parents: 64283
diff changeset
4002 done:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4003 Py_XDECREF(self_as_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4004
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4005 return result;
42817
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
4006 }
5355337709e1 Implementation of PEP 3101, Advanced String Formatting.
Eric Smith <eric@trueblade.com>
parents: 42673
diff changeset
4007
47466
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
4008 static PyObject *
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
4009 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
4010 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4011 Py_ssize_t res, isize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4012
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4013 res = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4014 isize = self->ob_type->tp_itemsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4015 if (isize > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4016 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
4017 res += self->ob_type->tp_basicsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4018
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4019 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
4020 }
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
4021
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4022 /* __dir__ for generic objects: returns __dict__, __class__,
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4023 and recursively up the __class__.__bases__ chain.
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4024 */
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4025 static PyObject *
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4026 object_dir(PyObject *self, PyObject *args)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4027 {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4028 PyObject *result = NULL;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4029 PyObject *dict = NULL;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4030 PyObject *itsclass = NULL;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4031
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4032 /* Get __dict__ (which may or may not be a real dict...) */
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
4033 dict = _PyObject_GetAttrId(self, &PyId___dict__);
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4034 if (dict == NULL) {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4035 PyErr_Clear();
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4036 dict = PyDict_New();
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4037 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4038 else if (!PyDict_Check(dict)) {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4039 Py_DECREF(dict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4040 dict = PyDict_New();
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4041 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4042 else {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4043 /* Copy __dict__ to avoid mutating it. */
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4044 PyObject *temp = PyDict_Copy(dict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4045 Py_DECREF(dict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4046 dict = temp;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4047 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4048
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4049 if (dict == NULL)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4050 goto error;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4051
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4052 /* Merge in attrs reachable from its class. */
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
4053 itsclass = _PyObject_GetAttrId(self, &PyId___class__);
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4054 if (itsclass == NULL)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4055 /* XXX(tomer): Perhaps fall back to obj->ob_type if no
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4056 __class__ exists? */
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4057 PyErr_Clear();
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4058 else if (merge_class_dict(dict, itsclass) != 0)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4059 goto error;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4060
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4061 result = PyDict_Keys(dict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4062 /* fall through */
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4063 error:
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4064 Py_XDECREF(itsclass);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4065 Py_XDECREF(dict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4066 return result;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4067 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4068
20084
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
4069 static PyMethodDef object_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4070 {"__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
4071 PyDoc_STR("helper for pickle")},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4072 {"__reduce__", object_reduce, METH_VARARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4073 PyDoc_STR("helper for pickle")},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4074 {"__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
4075 object_subclasshook_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4076 {"__format__", object_format, METH_VARARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4077 PyDoc_STR("default object formatter")},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4078 {"__sizeof__", object_sizeof, METH_NOARGS,
70338
310b484ebd91 use '->' to indicate return values
Benjamin Peterson <benjamin@python.org>
parents: 68585
diff changeset
4079 PyDoc_STR("__sizeof__() -> int\nsize of object in memory, in bytes")},
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68587
diff changeset
4080 {"__dir__", object_dir, METH_NOARGS,
70342
6f078d80898f indicate return value on __dir__ methods
Benjamin Peterson <benjamin@python.org>
parents: 70341
diff changeset
4081 PyDoc_STR("__dir__() -> list\ndefault dir() implementation")},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4082 {0}
20084
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
4083 };
48e93ef3c5b7 - Provisional support for pickling new-style objects. (*)
Guido van Rossum <guido@python.org>
parents: 20076
diff changeset
4084
28016
b849482c70c6 Implementing the salient parts of __reduce_ex__ in C.
Guido van Rossum <guido@python.org>
parents: 27948
diff changeset
4085
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4086 PyTypeObject PyBaseObject_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4087 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4088 "object", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4089 sizeof(PyObject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4090 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4091 object_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4092 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4093 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4094 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4095 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4096 object_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4097 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4098 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4099 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4100 (hashfunc)_Py_HashPointer, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4101 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4102 object_str, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4103 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4104 PyObject_GenericSetAttr, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4105 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4106 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
4107 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
4108 0, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4109 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4110 object_richcompare, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4111 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4112 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4113 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4114 object_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4115 0, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4116 object_getsets, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4117 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4118 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4119 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4120 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4121 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4122 object_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4123 PyType_GenericAlloc, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4124 object_new, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4125 PyObject_Del, /* tp_free */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4126 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4127
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4128
39536
8f5b9982beba Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
4129 /* 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
4130
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4131 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4132 add_methods(PyTypeObject *type, PyMethodDef *meth)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4133 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4134 PyObject *dict = type->tp_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4135
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4136 for (; meth->ml_name != NULL; meth++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4137 PyObject *descr;
76836
d937b527b76e fix possible refleak (closes #14752)
Benjamin Peterson <benjamin@python.org>
parents: 76518
diff changeset
4138 int err;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4139 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
4140 !(meth->ml_flags & METH_COEXIST))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4141 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4142 if (meth->ml_flags & METH_CLASS) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4143 if (meth->ml_flags & METH_STATIC) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4144 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4145 "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
4146 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4147 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4148 descr = PyDescr_NewClassMethod(type, meth);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4149 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4150 else if (meth->ml_flags & METH_STATIC) {
81031
3a86a3f1d89a Issue #15422: get rid of PyCFunction_New macro
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80991
diff changeset
4151 PyObject *cfunc = PyCFunction_NewEx(meth, (PyObject*)type, NULL);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4152 if (cfunc == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4153 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4154 descr = PyStaticMethod_New(cfunc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4155 Py_DECREF(cfunc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4156 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4157 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4158 descr = PyDescr_NewMethod(type, meth);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4159 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4160 if (descr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4161 return -1;
76836
d937b527b76e fix possible refleak (closes #14752)
Benjamin Peterson <benjamin@python.org>
parents: 76518
diff changeset
4162 err = PyDict_SetItemString(dict, meth->ml_name, descr);
d937b527b76e fix possible refleak (closes #14752)
Benjamin Peterson <benjamin@python.org>
parents: 76518
diff changeset
4163 Py_DECREF(descr);
d937b527b76e fix possible refleak (closes #14752)
Benjamin Peterson <benjamin@python.org>
parents: 76518
diff changeset
4164 if (err < 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4165 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4166 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4167 return 0;
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
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4170 static int
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19970
diff changeset
4171 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
4172 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4173 PyObject *dict = type->tp_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4174
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4175 for (; memb->name != NULL; memb++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4176 PyObject *descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4177 if (PyDict_GetItemString(dict, memb->name))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4178 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4179 descr = PyDescr_NewMember(type, memb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4180 if (descr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4181 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4182 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
4183 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4184 Py_DECREF(descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4185 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4186 return 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4187 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4188
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4189 static int
20015
ca7af2a5d915 Add optional docstrings to getset descriptors. Fortunately, there's
Guido van Rossum <guido@python.org>
parents: 20012
diff changeset
4190 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
4191 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4192 PyObject *dict = type->tp_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4193
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4194 for (; gsp->name != NULL; gsp++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4195 PyObject *descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4196 if (PyDict_GetItemString(dict, gsp->name))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4197 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4198 descr = PyDescr_NewGetSet(type, gsp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4199
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4200 if (descr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4201 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4202 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
4203 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4204 Py_DECREF(descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4205 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4206 return 0;
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
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
4209 static void
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
4210 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
4211 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4212
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4213 /* 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
4214 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
4215 (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
4216 (!type->tp_traverse && !type->tp_clear)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4217 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
4218 if (type->tp_traverse == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4219 type->tp_traverse = base->tp_traverse;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4220 if (type->tp_clear == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4221 type->tp_clear = base->tp_clear;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4222 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4223 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4224 /* 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
4225 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
4226 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
4227 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
4228 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
4229 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
4230 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
4231 inherit tp_new; static extension types that specify some
73949
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
4232 other built-in type as the default also
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
4233 inherit object.__new__. */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4234 if (base != &PyBaseObject_Type ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4235 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4236 if (type->tp_new == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4237 type->tp_new = base->tp_new;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4238 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4239 }
62806
a7c8b4a6678b cleanup basicsize logic #3268
Benjamin Peterson <benjamin@python.org>
parents: 62088
diff changeset
4240 if (type->tp_basicsize == 0)
a7c8b4a6678b cleanup basicsize logic #3268
Benjamin Peterson <benjamin@python.org>
parents: 62088
diff changeset
4241 type->tp_basicsize = base->tp_basicsize;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4242
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4243 /* 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
4244
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
4245 #undef COPYVAL
968d169501f2 Non-function fields, like tp_dictoffset and tp_weaklistoffset, should
Guido van Rossum <guido@python.org>
parents: 19194
diff changeset
4246 #define COPYVAL(SLOT) \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4247 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
4248
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4249 COPYVAL(tp_itemsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4250 COPYVAL(tp_weaklistoffset);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4251 COPYVAL(tp_dictoffset);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4252
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4253 /* Setup fast subclass flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4254 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
4255 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
4256 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
4257 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
4258 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
4259 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
4260 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
4261 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
4262 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
4263 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
4264 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
4265 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
4266 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
4267 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
4268 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
4269 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
4270 }
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
4271
39623
c6d9fa81f20f Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
4272 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
4273 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
4274 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4275 PyObject *dict = type->tp_dict;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
4276 _Py_IDENTIFIER(__eq__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4277
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4278 assert(dict != NULL);
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
4279 if (_PyDict_GetItemId(dict, &PyId___eq__) != NULL)
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
4280 return 1;
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
4281 if (_PyDict_GetItemId(dict, &PyId___hash__) != NULL)
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
4282 return 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4283 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
4284 }
c6d9fa81f20f Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
4285
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
4286 static void
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
4287 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
4288 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4289 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
4290
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
4291 #undef SLOTDEFINED
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4292 #undef COPYSLOT
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4293 #undef COPYNUM
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4294 #undef COPYSEQ
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4295 #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
4296 #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
4297
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
4298 #define SLOTDEFINED(SLOT) \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4299 (base->SLOT != 0 && \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4300 (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
4301
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4302 #define COPYSLOT(SLOT) \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4303 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
4304
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4305 #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
4306 #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
4307 #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
4308 #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
4309
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4310 /* 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
4311 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
4312
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4313 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
4314 basebase = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4315 if (basebase->tp_as_number == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4316 basebase = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4317 COPYNUM(nb_add);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4318 COPYNUM(nb_subtract);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4319 COPYNUM(nb_multiply);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4320 COPYNUM(nb_remainder);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4321 COPYNUM(nb_divmod);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4322 COPYNUM(nb_power);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4323 COPYNUM(nb_negative);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4324 COPYNUM(nb_positive);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4325 COPYNUM(nb_absolute);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4326 COPYNUM(nb_bool);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4327 COPYNUM(nb_invert);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4328 COPYNUM(nb_lshift);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4329 COPYNUM(nb_rshift);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4330 COPYNUM(nb_and);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4331 COPYNUM(nb_xor);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4332 COPYNUM(nb_or);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4333 COPYNUM(nb_int);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4334 COPYNUM(nb_float);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4335 COPYNUM(nb_inplace_add);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4336 COPYNUM(nb_inplace_subtract);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4337 COPYNUM(nb_inplace_multiply);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4338 COPYNUM(nb_inplace_remainder);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4339 COPYNUM(nb_inplace_power);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4340 COPYNUM(nb_inplace_lshift);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4341 COPYNUM(nb_inplace_rshift);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4342 COPYNUM(nb_inplace_and);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4343 COPYNUM(nb_inplace_xor);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4344 COPYNUM(nb_inplace_or);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4345 COPYNUM(nb_true_divide);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4346 COPYNUM(nb_floor_divide);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4347 COPYNUM(nb_inplace_true_divide);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4348 COPYNUM(nb_inplace_floor_divide);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4349 COPYNUM(nb_index);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4350 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4351
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4352 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
4353 basebase = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4354 if (basebase->tp_as_sequence == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4355 basebase = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4356 COPYSEQ(sq_length);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4357 COPYSEQ(sq_concat);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4358 COPYSEQ(sq_repeat);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4359 COPYSEQ(sq_item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4360 COPYSEQ(sq_ass_item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4361 COPYSEQ(sq_contains);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4362 COPYSEQ(sq_inplace_concat);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4363 COPYSEQ(sq_inplace_repeat);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4364 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4365
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4366 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
4367 basebase = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4368 if (basebase->tp_as_mapping == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4369 basebase = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4370 COPYMAP(mp_length);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4371 COPYMAP(mp_subscript);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4372 COPYMAP(mp_ass_subscript);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4373 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4374
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4375 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
4376 basebase = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4377 if (basebase->tp_as_buffer == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4378 basebase = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4379 COPYBUF(bf_getbuffer);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4380 COPYBUF(bf_releasebuffer);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4381 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4382
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4383 basebase = base->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4384
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4385 COPYSLOT(tp_dealloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4386 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
4387 type->tp_getattr = base->tp_getattr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4388 type->tp_getattro = base->tp_getattro;
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 (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
4391 type->tp_setattr = base->tp_setattr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4392 type->tp_setattro = base->tp_setattro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4393 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4394 /* tp_reserved is ignored */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4395 COPYSLOT(tp_repr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4396 /* tp_hash see tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4397 COPYSLOT(tp_call);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4398 COPYSLOT(tp_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4399 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4400 /* Copy comparison-related slots only when
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4401 not overriding them anywhere */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4402 if (type->tp_richcompare == NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4403 type->tp_hash == NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4404 !overrides_hash(type))
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 type->tp_richcompare = base->tp_richcompare;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4407 type->tp_hash = base->tp_hash;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4408 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4409 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4410 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4411 COPYSLOT(tp_iter);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4412 COPYSLOT(tp_iternext);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4413 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4414 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4415 COPYSLOT(tp_descr_get);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4416 COPYSLOT(tp_descr_set);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4417 COPYSLOT(tp_dictoffset);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4418 COPYSLOT(tp_init);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4419 COPYSLOT(tp_alloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4420 COPYSLOT(tp_is_gc);
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
4421 if ((type->tp_flags & Py_TPFLAGS_HAVE_FINALIZE) &&
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
4422 (base->tp_flags & Py_TPFLAGS_HAVE_FINALIZE)) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
4423 COPYSLOT(tp_finalize);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
4424 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4425 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
4426 (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
4427 /* They agree about gc. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4428 COPYSLOT(tp_free);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4429 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4430 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
4431 type->tp_free == NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4432 base->tp_free == PyObject_Free) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4433 /* 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
4434 * 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
4435 * 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
4436 * default non-gc tp_free.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4437 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4438 type->tp_free = PyObject_GC_Del;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4439 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4440 /* 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
4441 * 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
4442 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4443 }
19153
64d4ad73a887 - Big changes to fix SF bug #442833 (a nasty multiple inheritance
Guido van Rossum <guido@python.org>
parents: 19136
diff changeset
4444 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4445
24280
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24250
diff changeset
4446 static int add_operators(PyTypeObject *);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4447
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4448 int
19040
4df72ea78ae8 - Rename PyType_InitDict() to PyType_Ready().
Guido van Rossum <guido@python.org>
parents: 19036
diff changeset
4449 PyType_Ready(PyTypeObject *type)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4450 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4451 PyObject *dict, *bases;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4452 PyTypeObject *base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4453 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4454
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4455 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
4456 assert(type->tp_dict != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4457 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4458 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4459 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
4460
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4461 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
4462
28389
4ede57a42c62 Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents: 28288
diff changeset
4463 #ifdef Py_TRACE_REFS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4464 /* 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
4465 * 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
4466 * 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
4467 * 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
4468 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4469 _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
4470 #endif
4ede57a42c62 Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents: 28288
diff changeset
4471
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4472 /* 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
4473 base = type->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4474 if (base == NULL && type != &PyBaseObject_Type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4475 base = type->tp_base = &PyBaseObject_Type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4476 Py_INCREF(base);
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4479 /* 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
4480 * &PyBaseObject_Type.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4481 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4482
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4483 /* Initialize the base class */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4484 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
4485 if (PyType_Ready(base) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4486 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4487 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4488
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4489 /* 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
4490 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
4491 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
4492 /* 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
4493 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
4494 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
4495 know that. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4496 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
4497 Py_TYPE(type) = Py_TYPE(base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4498
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4499 /* Initialize tp_bases */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4500 bases = type->tp_bases;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4501 if (bases == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4502 if (base == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4503 bases = PyTuple_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4504 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4505 bases = PyTuple_Pack(1, base);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4506 if (bases == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4507 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4508 type->tp_bases = bases;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4509 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4510
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4511 /* Initialize tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4512 dict = type->tp_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4513 if (dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4514 dict = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4515 if (dict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4516 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4517 type->tp_dict = dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4518 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4519
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4520 /* 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
4521 if (add_operators(type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4522 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4523 if (type->tp_methods != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4524 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
4525 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4526 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4527 if (type->tp_members != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4528 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
4529 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4530 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4531 if (type->tp_getset != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4532 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
4533 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4534 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4535
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4536 /* Calculate method resolution order */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4537 if (mro_internal(type) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4538 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4539 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4540
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4541 /* Inherit special flags from dominant base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4542 if (type->tp_base != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4543 inherit_special(type, type->tp_base);
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 /* Initialize tp_dict properly */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4546 bases = type->tp_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4547 assert(bases != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4548 assert(PyTuple_Check(bases));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4549 n = PyTuple_GET_SIZE(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4550 for (i = 1; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4551 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
4552 if (PyType_Check(b))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4553 inherit_slots(type, (PyTypeObject *)b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4554 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4555
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4556 /* Sanity check for tp_free. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4557 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
4558 (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
4559 /* 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
4560 * 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
4561 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4562 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
4563 "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
4564 "tp_free slot",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4565 type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4566 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4567 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4568
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4569 /* 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
4570 the tp_doc slot.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4571 */
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
4572 if (_PyDict_GetItemId(type->tp_dict, &PyId___doc__) == NULL) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4573 if (type->tp_doc != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4574 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
4575 if (doc == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4576 goto error;
84697
c2d90ff0780c Issue #18408: Fix PyType_Ready(), handle _PyDict_SetItemId() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84677
diff changeset
4577 if (_PyDict_SetItemId(type->tp_dict, &PyId___doc__, doc) < 0) {
c2d90ff0780c Issue #18408: Fix PyType_Ready(), handle _PyDict_SetItemId() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84677
diff changeset
4578 Py_DECREF(doc);
c2d90ff0780c Issue #18408: Fix PyType_Ready(), handle _PyDict_SetItemId() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84677
diff changeset
4579 goto error;
c2d90ff0780c Issue #18408: Fix PyType_Ready(), handle _PyDict_SetItemId() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84677
diff changeset
4580 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4581 Py_DECREF(doc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4582 } else {
84697
c2d90ff0780c Issue #18408: Fix PyType_Ready(), handle _PyDict_SetItemId() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84677
diff changeset
4583 if (_PyDict_SetItemId(type->tp_dict,
c2d90ff0780c Issue #18408: Fix PyType_Ready(), handle _PyDict_SetItemId() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84677
diff changeset
4584 &PyId___doc__, Py_None) < 0)
c2d90ff0780c Issue #18408: Fix PyType_Ready(), handle _PyDict_SetItemId() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 84677
diff changeset
4585 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4586 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4587 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4588
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4589 /* Hack for tp_hash and __hash__.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4590 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
4591 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
4592 tp_dict['__hash__'] equal to None.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4593 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
4594 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4595 if (type->tp_hash == NULL) {
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
4596 if (_PyDict_GetItemId(type->tp_dict, &PyId___hash__) == NULL) {
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
4597 if (_PyDict_SetItemId(type->tp_dict, &PyId___hash__, Py_None) < 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4598 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4599 type->tp_hash = PyObject_HashNotImplemented;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4600 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4601 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4602
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4603 /* Some more special stuff */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4604 base = type->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4605 if (base != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4606 if (type->tp_as_number == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4607 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
4608 if (type->tp_as_sequence == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4609 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
4610 if (type->tp_as_mapping == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4611 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
4612 if (type->tp_as_buffer == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4613 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
4614 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4615
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4616 /* 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
4617 bases = type->tp_bases;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4618 n = PyTuple_GET_SIZE(bases);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4619 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4620 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
4621 if (PyType_Check(b) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4622 add_subclass((PyTypeObject *)b, type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4623 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4624 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4625
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4626 /* 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
4627 tp_reserved) but not tp_richcompare. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4628 if (type->tp_reserved && !type->tp_richcompare) {
80991
d91c14788729 Issue #9856: Replace deprecation warinigs to raising TypeError in object.__format__
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80079
diff changeset
4629 PyErr_Format(PyExc_TypeError,
63949
fa2d9720a66c Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63114
diff changeset
4630 "Type %.100s defines tp_reserved (formerly tp_compare) "
fa2d9720a66c Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63114
diff changeset
4631 "but not tp_richcompare. Comparisons may not behave as intended.",
fa2d9720a66c Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63114
diff changeset
4632 type->tp_name);
80991
d91c14788729 Issue #9856: Replace deprecation warinigs to raising TypeError in object.__format__
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80079
diff changeset
4633 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4634 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4635
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4636 /* All done -- set the ready flag */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4637 assert(type->tp_dict != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4638 type->tp_flags =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4639 (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
4640 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
4641
6463cd9db2fc Change PyType_Ready() to use the READY and READYING flags. This makes
Guido van Rossum <guido@python.org>
parents: 19109
diff changeset
4642 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4643 type->tp_flags &= ~Py_TPFLAGS_READYING;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4644 return -1;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4645 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4646
20315
7b41f7a2e528 Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents: 20296
diff changeset
4647 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
4648 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
4649 {
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4650 int result = -1;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4651 PyObject *dict, *key, *newobj;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4652
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4653 dict = base->tp_subclasses;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4654 if (dict == NULL) {
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4655 base->tp_subclasses = dict = PyDict_New();
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4656 if (dict == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4657 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4658 }
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4659 assert(PyDict_CheckExact(dict));
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4660 key = PyLong_FromVoidPtr((void *) type);
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4661 if (key == NULL)
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4662 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4663 newobj = PyWeakref_NewRef((PyObject *)type, NULL);
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4664 if (newobj != NULL) {
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4665 result = PyDict_SetItem(dict, key, newobj);
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4666 Py_DECREF(newobj);
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4667 }
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4668 Py_DECREF(key);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4669 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
4670 }
7b41f7a2e528 Keep track of a type's subclasses (subtypes), in tp_subclasses, which
Guido van Rossum <guido@python.org>
parents: 20296
diff changeset
4671
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
4672 static void
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
4673 remove_subclass(PyTypeObject *base, PyTypeObject *type)
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
4674 {
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4675 PyObject *dict, *key;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4676
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4677 dict = base->tp_subclasses;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4678 if (dict == NULL) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4679 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4680 }
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4681 assert(PyDict_CheckExact(dict));
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4682 key = PyLong_FromVoidPtr((void *) type);
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4683 if (key == NULL || PyDict_DelItem(dict, key)) {
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4684 /* This can happen if the type initialization errored out before
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4685 the base subclasses were updated (e.g. a non-str __qualname__
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4686 was passed in the type dict). */
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4687 PyErr_Clear();
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4688 }
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4689 Py_XDECREF(key);
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4690 }
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4691
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4692 static void
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4693 remove_all_subclasses(PyTypeObject *type, PyObject *bases)
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4694 {
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4695 if (bases) {
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4696 Py_ssize_t i;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4697 for (i = 0; i < PyTuple_GET_SIZE(bases); i++) {
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4698 PyObject *base = PyTuple_GET_ITEM(bases, i);
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4699 if (PyType_Check(base))
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
4700 remove_subclass((PyTypeObject*) base, type);
61467
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 }
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
4703 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4704
31176
381140e7e9d7 Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents: 31172
diff changeset
4705 static int
381140e7e9d7 Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents: 31172
diff changeset
4706 check_num_args(PyObject *ob, int n)
381140e7e9d7 Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents: 31172
diff changeset
4707 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4708 if (!PyTuple_CheckExact(ob)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4709 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4710 "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
4711 return 0;
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 if (n == PyTuple_GET_SIZE(ob))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4714 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4715 PyErr_Format(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4716 PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4717 "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
4718 return 0;
31176
381140e7e9d7 Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents: 31172
diff changeset
4719 }
381140e7e9d7 Improve argument checking speed.
Raymond Hettinger <python@rcn.com>
parents: 31172
diff changeset
4720
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4721 /* 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
4722
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4723 /* 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
4724 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
4725 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
4726 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
4727 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
4728
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4729 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36169
diff changeset
4730 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
4731 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4732 lenfunc func = (lenfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4733 Py_ssize_t res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4734
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4735 if (!check_num_args(args, 0))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4736 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4737 res = (*func)(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4738 if (res == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4739 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4740 return PyLong_FromLong((long)res);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4741 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4742
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4743 static PyObject *
30670
7f6134f8bd06 SF bug #820397: __nonzero__() returns 1/0
Raymond Hettinger <python@rcn.com>
parents: 30660
diff changeset
4744 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
4745 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4746 inquiry func = (inquiry)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4747 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4748
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4749 if (!check_num_args(args, 0))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4750 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4751 res = (*func)(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4752 if (res == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4753 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4754 return PyBool_FromLong((long)res);
30670
7f6134f8bd06 SF bug #820397: __nonzero__() returns 1/0
Raymond Hettinger <python@rcn.com>
parents: 30660
diff changeset
4755 }
7f6134f8bd06 SF bug #820397: __nonzero__() returns 1/0
Raymond Hettinger <python@rcn.com>
parents: 30660
diff changeset
4756
7f6134f8bd06 SF bug #820397: __nonzero__() returns 1/0
Raymond Hettinger <python@rcn.com>
parents: 30660
diff changeset
4757 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4758 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
4759 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4760 binaryfunc func = (binaryfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4761 PyObject *other;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4762
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4763 if (!check_num_args(args, 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4764 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4765 other = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4766 return (*func)(self, other);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4767 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4768
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4769 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
4770 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
4771 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4772 binaryfunc func = (binaryfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4773 PyObject *other;
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 if (!check_num_args(args, 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4776 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4777 other = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4778 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
4779 }
26b5f8b94872 It turned out not so difficult to support old-style numbers (those
Guido van Rossum <guido@python.org>
parents: 20320
diff changeset
4780
26b5f8b94872 It turned out not so difficult to support old-style numbers (those
Guido van Rossum <guido@python.org>
parents: 20320
diff changeset
4781 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4782 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
4783 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4784 binaryfunc func = (binaryfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4785 PyObject *other;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4786
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4787 if (!check_num_args(args, 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4788 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4789 other = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4790 return (*func)(other, self);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4791 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4792
20140
225f17ec8932 Merge branch changes (coercion, rich comparisons) into trunk.
Guido van Rossum <guido@python.org>
parents: 20095
diff changeset
4793 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4794 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
4795 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4796 ternaryfunc func = (ternaryfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4797 PyObject *other;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4798 PyObject *third = Py_None;
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 /* 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
4801
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4802 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
4803 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4804 return (*func)(self, other, third);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4805 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4806
20168
091e9e3ceeaf Ouch. The wrapper for __rpow__ was the same as for __pow__, resulting
Guido van Rossum <guido@python.org>
parents: 20140
diff changeset
4807 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
4808 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
4809 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4810 ternaryfunc func = (ternaryfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4811 PyObject *other;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4812 PyObject *third = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4813
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4814 /* 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
4815
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4816 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
4817 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4818 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
4819 }
091e9e3ceeaf Ouch. The wrapper for __rpow__ was the same as for __pow__, resulting
Guido van Rossum <guido@python.org>
parents: 20140
diff changeset
4820
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4821 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4822 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
4823 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4824 unaryfunc func = (unaryfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4825
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4826 if (!check_num_args(args, 0))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4827 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4828 return (*func)(self);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4829 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4830
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4831 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
4832 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
4833 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4834 ssizeargfunc func = (ssizeargfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4835 PyObject* o;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4836 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4837
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4838 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
4839 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4840 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
4841 if (i == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4842 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4843 return (*func)(self, i);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4844 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4845
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36169
diff changeset
4846 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
4847 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
4848 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4849 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4850
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4851 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
4852 if (i == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4853 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4854 if (i < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4855 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
4856 if (sq && sq->sq_length) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4857 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
4858 if (n < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4859 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4860 i += n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4861 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4862 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4863 return i;
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
4864 }
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
4865
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
4866 static PyObject *
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
4867 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
4868 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4869 ssizeargfunc func = (ssizeargfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4870 PyObject *arg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4871 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4872
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4873 if (PyTuple_GET_SIZE(args) == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4874 arg = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4875 i = getindex(self, arg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4876 if (i == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4877 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4878 return (*func)(self, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4879 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4880 check_num_args(args, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4881 assert(PyErr_Occurred());
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4882 return NULL;
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
4883 }
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
4884
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4885 static PyObject *
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
4886 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
4887 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4888 ssizeobjargproc func = (ssizeobjargproc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4889 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4890 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4891 PyObject *arg, *value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4892
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4893 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
4894 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4895 i = getindex(self, arg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4896 if (i == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4897 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4898 res = (*func)(self, i, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4899 if (res == -1 && PyErr_Occurred())
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 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4902 return Py_None;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4903 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4904
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
4905 static PyObject *
19353
051d8e380f38 Address SF bug #442813. The sequence getitem wrappers should do
Guido van Rossum <guido@python.org>
parents: 19349
diff changeset
4906 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
4907 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4908 ssizeobjargproc func = (ssizeobjargproc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4909 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4910 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4911 PyObject *arg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4912
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4913 if (!check_num_args(args, 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4914 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4915 arg = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4916 i = getindex(self, arg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4917 if (i == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4918 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4919 res = (*func)(self, i, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4920 if (res == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4921 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4922 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4923 return Py_None;
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
4924 }
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
4925
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4926 /* 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
4927 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4928 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
4929 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4930 objobjproc func = (objobjproc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4931 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4932 PyObject *value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4933
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4934 if (!check_num_args(args, 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4935 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4936 value = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4937 res = (*func)(self, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4938 if (res == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4939 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4940 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4941 return PyBool_FromLong(res);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4942 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4943
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4944 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4945 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
4946 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4947 objobjargproc func = (objobjargproc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4948 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4949 PyObject *key, *value;
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 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
4952 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4953 res = (*func)(self, key, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4954 if (res == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4955 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4956 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4957 return Py_None;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4958 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4959
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
4960 static PyObject *
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
4961 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
4962 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4963 objobjargproc func = (objobjargproc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4964 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4965 PyObject *key;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4966
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4967 if (!check_num_args(args, 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4968 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4969 key = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4970 res = (*func)(self, key, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4971 if (res == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4972 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4973 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4974 return Py_None;
18941
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
4975 }
013cffcfd8a3 Fix SF #442791 (revisited): No __delitem__ wrapper was defined.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
4976
28608
8322077d234c Close off the "Verre Carlo hack" as discussed on python-dev.
Guido van Rossum <guido@python.org>
parents: 28607
diff changeset
4977 /* 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
4978 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
4979 static int
8322077d234c Close off the "Verre Carlo hack" as discussed on python-dev.
Guido van Rossum <guido@python.org>
parents: 28607
diff changeset
4980 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
4981 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4982 PyTypeObject *type = Py_TYPE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4983 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
4984 type = type->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4985 /* 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
4986 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
4987 if (type && type->tp_setattro != func) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4988 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4989 "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
4990 what,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4991 type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4992 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4993 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
4994 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
4995 }
8322077d234c Close off the "Verre Carlo hack" as discussed on python-dev.
Guido van Rossum <guido@python.org>
parents: 28607
diff changeset
4996
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4997 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
4998 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
4999 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5000 setattrofunc func = (setattrofunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5001 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5002 PyObject *name, *value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5003
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5004 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
5005 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5006 if (!hackcheck(self, func, "__setattr__"))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5007 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5008 res = (*func)(self, name, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5009 if (res < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5010 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5011 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5012 return Py_None;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5013 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5014
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5015 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5016 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
5017 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5018 setattrofunc func = (setattrofunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5019 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5020 PyObject *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 if (!check_num_args(args, 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5023 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5024 name = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5025 if (!hackcheck(self, func, "__delattr__"))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5026 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5027 res = (*func)(self, name, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5028 if (res < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5029 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5030 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5031 return Py_None;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5032 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5033
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5034 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5035 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
5036 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5037 hashfunc func = (hashfunc)wrapped;
65603
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65599
diff changeset
5038 Py_hash_t res;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5039
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5040 if (!check_num_args(args, 0))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5041 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5042 res = (*func)(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5043 if (res == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5044 return NULL;
65603
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65599
diff changeset
5045 return PyLong_FromSsize_t(res);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5046 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5047
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5048 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
5049 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
5050 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5051 ternaryfunc func = (ternaryfunc)wrapped;
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 return (*func)(self, args, kwds);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5054 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5055
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5056 static PyObject *
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5057 wrap_del(PyObject *self, PyObject *args, void *wrapped)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5058 {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5059 destructor func = (destructor)wrapped;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5060
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5061 if (!check_num_args(args, 0))
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5062 return NULL;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5063
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5064 (*func)(self);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5065 Py_RETURN_NONE;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5066 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5067
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5068 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5069 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
5070 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5071 richcmpfunc func = (richcmpfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5072 PyObject *other;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5073
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5074 if (!check_num_args(args, 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5075 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5076 other = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5077 return (*func)(self, other, op);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5078 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5079
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5080 #undef RICHCMP_WRAPPER
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5081 #define RICHCMP_WRAPPER(NAME, OP) \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5082 static PyObject * \
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5083 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
5084 { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5085 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
5086 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5087
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
5088 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
5089 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
5090 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
5091 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
5092 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
5093 RICHCMP_WRAPPER(ge, Py_GE)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5094
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5095 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5096 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
5097 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5098 unaryfunc func = (unaryfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5099 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5100
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5101 if (!check_num_args(args, 0))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5102 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5103 res = (*func)(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5104 if (res == NULL && !PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5105 PyErr_SetNone(PyExc_StopIteration);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5106 return res;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5107 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5108
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5109 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5110 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
5111 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5112 descrgetfunc func = (descrgetfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5113 PyObject *obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5114 PyObject *type = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5115
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5116 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
5117 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5118 if (obj == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5119 obj = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5120 if (type == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5121 type = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5122 if (type == NULL &&obj == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5123 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5124 "__get__(None, None) is invalid");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5125 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5126 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5127 return (*func)(self, obj, type);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5128 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5129
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5130 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
5131 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
5132 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5133 descrsetfunc func = (descrsetfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5134 PyObject *obj, *value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5135 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5136
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5137 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
5138 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5139 ret = (*func)(self, obj, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5140 if (ret < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5141 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5142 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5143 return Py_None;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5144 }
24614
40eb80dc4250 Fix SF bug 574207 (chained __slots__ dealloc segfault).
Guido van Rossum <guido@python.org>
parents: 24460
diff changeset
5145
24460
2d77be41ee5f SF patch 588728 (Nathan Srebro).
Guido van Rossum <guido@python.org>
parents: 24427
diff changeset
5146 static PyObject *
2d77be41ee5f SF patch 588728 (Nathan Srebro).
Guido van Rossum <guido@python.org>
parents: 24427
diff changeset
5147 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
5148 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5149 descrsetfunc func = (descrsetfunc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5150 PyObject *obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5151 int ret;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5152
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5153 if (!check_num_args(args, 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5154 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5155 obj = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5156 ret = (*func)(self, obj, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5157 if (ret < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5158 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5159 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5160 return Py_None;
24460
2d77be41ee5f SF patch 588728 (Nathan Srebro).
Guido van Rossum <guido@python.org>
parents: 24427
diff changeset
5161 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5162
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5163 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
5164 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
5165 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5166 initproc func = (initproc)wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5167
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5168 if (func(self, args, kwds) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5169 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5170 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5171 return Py_None;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5172 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5173
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5174 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
5175 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
5176 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5177 PyTypeObject *type, *subtype, *staticbase;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5178 PyObject *arg0, *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5179
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5180 if (self == NULL || !PyType_Check(self))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5181 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
5182 type = (PyTypeObject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5183 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
5184 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5185 "%s.__new__(): not enough arguments",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5186 type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5187 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5188 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5189 arg0 = PyTuple_GET_ITEM(args, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5190 if (!PyType_Check(arg0)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5191 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5192 "%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
5193 type->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5194 Py_TYPE(arg0)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5195 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5196 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5197 subtype = (PyTypeObject *)arg0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5198 if (!PyType_IsSubtype(subtype, type)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5199 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5200 "%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
5201 type->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5202 subtype->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5203 subtype->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5204 type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5205 return NULL;
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
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5208 /* 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
5209 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
5210 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
5211 staticbase = subtype;
77651
bb6df3781edb Issue #15146: Add PyType_FromSpecWithBases. Patch by Robin Schreiber.
Martin v. Löwis <martin@v.loewis.de>
parents: 77629
diff changeset
5212 while (staticbase && (staticbase->tp_new == slot_tp_new))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5213 staticbase = staticbase->tp_base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5214 /* 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
5215 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
5216 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
5217 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5218 "%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
5219 type->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5220 subtype->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5221 staticbase == NULL ? "?" : staticbase->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5222 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5223 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5224
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5225 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
5226 if (args == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5227 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5228 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
5229 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5230 return res;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5231 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5232
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
5233 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
5234 {"__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
5235 PyDoc_STR("T.__new__(S, ...) -> "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5236 "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
5237 {0}
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5238 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5239
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5240 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
5241 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
5242 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5243 PyObject *func;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5244
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5245 if (_PyDict_GetItemId(type->tp_dict, &PyId___new__) != NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5246 return 0;
81031
3a86a3f1d89a Issue #15422: get rid of PyCFunction_New macro
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 80991
diff changeset
5247 func = PyCFunction_NewEx(tp_new_methoddef, (PyObject *)type, NULL);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5248 if (func == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5249 return -1;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5250 if (_PyDict_SetItemId(type->tp_dict, &PyId___new__, func)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5251 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5252 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5253 }
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 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
5256 }
c1daa94c21d8 A totally new way to do the __new__ wrapper. This should address the
Guido van Rossum <guido@python.org>
parents: 18941
diff changeset
5257
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
5258 /* Slot wrappers that call the corresponding __foo__ slot. See comments
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
5259 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
5260
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5261 #define SLOT0(FUNCNAME, OPSTR) \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5262 static PyObject * \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5263 FUNCNAME(PyObject *self) \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5264 { \
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5265 _Py_static_string(id, OPSTR); \
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5266 return call_method(self, &id, "()"); \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5267 }
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5268
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5269 #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
5270 static PyObject * \
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5271 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
5272 { \
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5273 _Py_static_string(id, OPSTR); \
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5274 return call_method(self, &id, "(" ARGCODES ")", arg1); \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5275 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5276
27124
d1850a36ae41 Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents: 26964
diff changeset
5277 /* 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
5278 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
5279 static int
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5280 method_is_overloaded(PyObject *left, PyObject *right, struct _Py_Identifier *name)
27124
d1850a36ae41 Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents: 26964
diff changeset
5281 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5282 PyObject *a, *b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5283 int ok;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5284
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5285 b = _PyObject_GetAttrId((PyObject *)(Py_TYPE(right)), name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5286 if (b == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5287 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5288 /* 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
5289 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5290 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5291
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5292 a = _PyObject_GetAttrId((PyObject *)(Py_TYPE(left)), name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5293 if (a == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5294 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5295 Py_DECREF(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5296 /* 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
5297 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5298 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5299
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5300 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
5301 Py_DECREF(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5302 Py_DECREF(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5303 if (ok < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5304 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5305 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5306 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5307
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5308 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
5309 }
d1850a36ae41 Add a refinement to SLOT1BINFULL() that fixes the problem reported in
Guido van Rossum <guido@python.org>
parents: 26964
diff changeset
5310
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5311
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5312 #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
5313 static PyObject * \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5314 FUNCNAME(PyObject *self, PyObject *other) \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5315 { \
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5316 _Py_static_string(op_id, OPSTR); \
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5317 _Py_static_string(rop_id, ROPSTR); \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5318 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
5319 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
5320 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
5321 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
5322 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
5323 PyObject *r; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5324 if (do_other && \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5325 PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self)) && \
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5326 method_is_overloaded(self, other, &rop_id)) { \
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5327 r = call_maybe(other, &rop_id, "(O)", self); \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5328 if (r != Py_NotImplemented) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5329 return r; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5330 Py_DECREF(r); \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5331 do_other = 0; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5332 } \
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5333 r = call_maybe(self, &op_id, "(O)", other); \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5334 if (r != Py_NotImplemented || \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5335 Py_TYPE(other) == Py_TYPE(self)) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5336 return r; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5337 Py_DECREF(r); \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5338 } \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5339 if (do_other) { \
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5340 return call_maybe(other, &rop_id, "(O)", self); \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5341 } \
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 71357
diff changeset
5342 Py_RETURN_NOTIMPLEMENTED; \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5343 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5344
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5345 #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
5346 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
5347
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5348 #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
5349 static PyObject * \
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5350 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
5351 { \
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5352 _Py_static_string(id, #OPSTR); \
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5353 return call_method(self, &id, "(" ARGCODES ")", arg1, arg2); \
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5354 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5355
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36169
diff changeset
5356 static Py_ssize_t
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5357 slot_sq_length(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5358 {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5359 PyObject *res = call_method(self, &PyId___len__, "()");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5360 Py_ssize_t len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5361
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5362 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5363 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5364 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
5365 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5366 if (len < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5367 if (!PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5368 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5369 "__len__() should return >= 0");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5370 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5371 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5372 return len;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5373 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5374
20229
8bad55edfdf3 *EXPERIMENTAL* speedup of slot_sq_item. This sped up the following
Guido van Rossum <guido@python.org>
parents: 20225
diff changeset
5375 /* 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
5376 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
5377 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36169
diff changeset
5378 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
5379 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5380 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
5381 descrgetfunc f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5382
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5383 func = _PyType_LookupId(Py_TYPE(self), &PyId___getitem__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5384 if (func != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5385 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
5386 Py_INCREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5387 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5388 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
5389 if (func == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5390 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5391 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5392 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5393 ival = PyLong_FromSsize_t(i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5394 if (ival != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5395 args = PyTuple_New(1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5396 if (args != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5397 PyTuple_SET_ITEM(args, 0, ival);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5398 retval = PyObject_Call(func, args, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5399 Py_XDECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5400 Py_XDECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5401 return retval;
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5404 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5405 else {
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5406 PyObject *getitem_str = _PyUnicode_FromId(&PyId___getitem__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5407 PyErr_SetObject(PyExc_AttributeError, getitem_str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5408 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5409 Py_XDECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5410 Py_XDECREF(ival);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5411 Py_XDECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5412 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
5413 }
8bad55edfdf3 *EXPERIMENTAL* speedup of slot_sq_item. This sped up the following
Guido van Rossum <guido@python.org>
parents: 20225
diff changeset
5414
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5415 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36169
diff changeset
5416 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
5417 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5418 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5419
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5420 if (value == NULL)
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5421 res = call_method(self, &PyId___delitem__, "(n)", index);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5422 else
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5423 res = call_method(self, &PyId___setitem__, "(nO)", index, value);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5424 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5425 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5426 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5427 return 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5428 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5429
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5430 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5431 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
5432 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5433 PyObject *func, *res, *args;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5434 int result = -1;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5435 _Py_IDENTIFIER(__contains__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5436
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5437 func = lookup_maybe(self, &PyId___contains__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5438 if (func != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5439 args = PyTuple_Pack(1, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5440 if (args == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5441 res = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5442 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5443 res = PyObject_Call(func, args, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5444 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5445 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5446 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5447 if (res != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5448 result = PyObject_IsTrue(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5449 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5450 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5451 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5452 else if (! PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5453 /* Possible results: -1 and 1 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5454 result = (int)_PySequence_IterSearch(self, value,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5455 PY_ITERSEARCH_CONTAINS);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5456 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5457 return result;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5458 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5459
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5460 #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
5461
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5462 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
5463
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5464 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5465 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
5466 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5467 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5468
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5469 if (value == NULL)
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5470 res = call_method(self, &PyId___delitem__, "(O)", key);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5471 else
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5472 res = call_method(self, &PyId___setitem__, "(OO)", key, value);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5473
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5474 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5475 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5476 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5477 return 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5478 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5479
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5480 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
5481 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
5482 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
5483 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
5484 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
5485
24280
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24250
diff changeset
5486 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
5487
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5488 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
5489 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
5490
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5491 static PyObject *
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5492 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
5493 {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5494 _Py_IDENTIFIER(__pow__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5495
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5496 if (modulus == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5497 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
5498 /* 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
5499 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
5500 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
5501 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
5502 Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5503 return call_method(self, &PyId___pow__, "(OO)", other, modulus);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5504 }
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 71357
diff changeset
5505 Py_RETURN_NOTIMPLEMENTED;
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5506 }
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5507
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5508 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
5509 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
5510 SLOT0(slot_nb_absolute, "__abs__")
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5511
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5512 static int
40401
88133417dfd0 - patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents: 39703
diff changeset
5513 slot_nb_bool(PyObject *self)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5514 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5515 PyObject *func, *args;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5516 int result = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5517 int using_len = 0;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5518 _Py_IDENTIFIER(__bool__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5519
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5520 func = lookup_maybe(self, &PyId___bool__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5521 if (func == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5522 if (PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5523 return -1;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5524 func = lookup_maybe(self, &PyId___len__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5525 if (func == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5526 return PyErr_Occurred() ? -1 : 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5527 using_len = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5528 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5529 args = PyTuple_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5530 if (args != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5531 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
5532 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5533 if (temp != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5534 if (using_len) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5535 /* enforced by slot_nb_len */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5536 result = PyObject_IsTrue(temp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5537 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5538 else if (PyBool_Check(temp)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5539 result = PyObject_IsTrue(temp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5540 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5541 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5542 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5543 "__bool__ should return "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5544 "bool, returned %s",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5545 Py_TYPE(temp)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5546 result = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5547 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5548 Py_DECREF(temp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5549 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5550 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5551 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5552 return result;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5553 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5554
36882
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36866
diff changeset
5555
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39603
diff changeset
5556 static PyObject *
36882
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36866
diff changeset
5557 slot_nb_index(PyObject *self)
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36866
diff changeset
5558 {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5559 _Py_IDENTIFIER(__index__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5560 return call_method(self, &PyId___index__, "()");
36882
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36866
diff changeset
5561 }
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36866
diff changeset
5562
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36866
diff changeset
5563
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5564 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
5565 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
5566 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
5567 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
5568 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
5569 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
5570
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5571 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
5572 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
5573 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
5574 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
5575 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
5576 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
5577 /* 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
5578 static PyObject *
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5579 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
5580 {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5581 _Py_IDENTIFIER(__ipow__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5582 return call_method(self, &PyId___ipow__, "(" "O" ")", arg1);
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40809
diff changeset
5583 }
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5584 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
5585 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
5586 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
5587 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
5588 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
5589 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
5590 "__floordiv__", "__rfloordiv__")
19082
88d124c74766 Proper support for binary operators, including true division and floor
Guido van Rossum <guido@python.org>
parents: 19070
diff changeset
5591 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
5592 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
5593 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
5594
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
5595 static PyObject *
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
5596 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
5597 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5598 PyObject *func, *res;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5599 _Py_IDENTIFIER(__repr__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5600
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5601 func = lookup_method(self, &PyId___repr__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5602 if (func != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5603 res = PyEval_CallObject(func, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5604 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5605 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5606 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5607 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5608 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
5609 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
5610 }
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
5611
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
5612 static PyObject *
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
5613 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
5614 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5615 PyObject *func, *res;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5616 _Py_IDENTIFIER(__str__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5617
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5618 func = lookup_method(self, &PyId___str__);
84561
01a46dc00fc8 Issue #18408: slot_tp_str() must not fallback on slot_tp_repr() on error
Victor Stinner <victor.stinner@gmail.com>
parents: 84560
diff changeset
5619 if (func == NULL)
01a46dc00fc8 Issue #18408: slot_tp_str() must not fallback on slot_tp_repr() on error
Victor Stinner <victor.stinner@gmail.com>
parents: 84560
diff changeset
5620 return NULL;
86733
a7f7f52398b8 fix indent
Victor Stinner <victor.stinner@gmail.com>
parents: 85910
diff changeset
5621 res = PyEval_CallObject(func, NULL);
a7f7f52398b8 fix indent
Victor Stinner <victor.stinner@gmail.com>
parents: 85910
diff changeset
5622 Py_DECREF(func);
a7f7f52398b8 fix indent
Victor Stinner <victor.stinner@gmail.com>
parents: 85910
diff changeset
5623 return res;
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
5624 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5625
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5626 static Py_hash_t
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5627 slot_tp_hash(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5628 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5629 PyObject *func, *res;
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5630 Py_ssize_t h;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5631
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5632 func = lookup_method(self, &PyId___hash__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5633
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5634 if (func == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5635 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5636 func = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5637 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5638
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5639 if (func == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5640 return PyObject_HashNotImplemented(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5641 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5642
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5643 res = PyEval_CallObject(func, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5644 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5645 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5646 return -1;
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61722
diff changeset
5647
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61722
diff changeset
5648 if (!PyLong_Check(res)) {
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61722
diff changeset
5649 PyErr_SetString(PyExc_TypeError,
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61722
diff changeset
5650 "__hash__ method should return an integer");
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61722
diff changeset
5651 return -1;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61722
diff changeset
5652 }
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5653 /* Transform the PyLong `res` to a Py_hash_t `h`. For an existing
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5654 hashable Python object x, hash(x) will always lie within the range of
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5655 Py_hash_t. Therefore our transformation must preserve values that
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5656 already lie within this range, to ensure that if x.__hash__() returns
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5657 hash(y) then hash(x) == hash(y). */
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5658 h = PyLong_AsSsize_t(res);
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5659 if (h == -1 && PyErr_Occurred()) {
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5660 /* res was not within the range of a Py_hash_t, so we're free to
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61722
diff changeset
5661 use any sufficiently bit-mixing transformation;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61722
diff changeset
5662 long.__hash__ will do nicely. */
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5663 PyErr_Clear();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5664 h = PyLong_Type.tp_hash(res);
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65067
diff changeset
5665 }
65499
b1bda1ec995f -1 is reserved for errors
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
5666 /* -1 is reserved for errors. */
b1bda1ec995f -1 is reserved for errors
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
5667 if (h == -1)
b1bda1ec995f -1 is reserved for errors
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
5668 h = -2;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5669 Py_DECREF(res);
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61722
diff changeset
5670 return h;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5671 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5672
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5673 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5674 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
5675 {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5676 _Py_IDENTIFIER(__call__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5677 PyObject *meth = lookup_method(self, &PyId___call__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5678 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5679
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5680 if (meth == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5681 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5682
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5683 res = PyObject_Call(meth, args, kwds);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5684
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5685 Py_DECREF(meth);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5686 return res;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5687 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5688
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
5689 /* 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
5690
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
5691 - 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
5692 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
5693
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
5694 - 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
5695
22834
0908729e94e0 A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents: 22804
diff changeset
5696 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
5697 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
5698 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
5699
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5700 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5701 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
5702 {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5703 return call_method(self, &PyId___getattribute__, "(O)", name);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5704 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5705
20028
df1b83fd0ebb Add the __getattr__ hook back. The rules are now:
Guido van Rossum <guido@python.org>
parents: 20021
diff changeset
5706 static PyObject *
49742
356c3e18da5e Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49518
diff changeset
5707 call_attribute(PyObject *self, PyObject *attr, PyObject *name)
356c3e18da5e Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49518
diff changeset
5708 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5709 PyObject *res, *descr = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5710 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
5711
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5712 if (f != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5713 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
5714 if (descr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5715 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5716 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5717 attr = descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5718 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5719 res = PyObject_CallFunctionObjArgs(attr, name, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5720 Py_XDECREF(descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5721 return res;
49742
356c3e18da5e Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49518
diff changeset
5722 }
356c3e18da5e Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49518
diff changeset
5723
356c3e18da5e Merged revisions 67246 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49518
diff changeset
5724 static PyObject *
20028
df1b83fd0ebb Add the __getattr__ hook back. The rules are now:
Guido van Rossum <guido@python.org>
parents: 20021
diff changeset
5725 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
5726 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5727 PyTypeObject *tp = Py_TYPE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5728 PyObject *getattr, *getattribute, *res;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5729 _Py_IDENTIFIER(__getattr__);
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5730
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5731 /* 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
5732 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
5733 __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
5734 _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
5735 call_attribute. */
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5736 getattr = _PyType_LookupId(tp, &PyId___getattr__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5737 if (getattr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5738 /* 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
5739 tp->tp_getattro = slot_tp_getattro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5740 return slot_tp_getattro(self, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5741 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5742 Py_INCREF(getattr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5743 /* 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
5744 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
5745 __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
5746 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
5747 needed, with call_attribute. */
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5748 getattribute = _PyType_LookupId(tp, &PyId___getattribute__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5749 if (getattribute == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5750 (Py_TYPE(getattribute) == &PyWrapperDescr_Type &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5751 ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5752 (void *)PyObject_GenericGetAttr))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5753 res = PyObject_GenericGetAttr(self, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5754 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5755 Py_INCREF(getattribute);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5756 res = call_attribute(self, getattribute, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5757 Py_DECREF(getattribute);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5758 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5759 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
5760 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5761 res = call_attribute(self, getattr, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5762 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5763 Py_DECREF(getattr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5764 return res;
20028
df1b83fd0ebb Add the __getattr__ hook back. The rules are now:
Guido van Rossum <guido@python.org>
parents: 20021
diff changeset
5765 }
df1b83fd0ebb Add the __getattr__ hook back. The rules are now:
Guido van Rossum <guido@python.org>
parents: 20021
diff changeset
5766
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5767 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5768 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
5769 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5770 PyObject *res;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5771 _Py_IDENTIFIER(__delattr__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5772 _Py_IDENTIFIER(__setattr__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5773
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5774 if (value == NULL)
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5775 res = call_method(self, &PyId___delattr__, "(O)", name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5776 else
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5777 res = call_method(self, &PyId___setattr__, "(OO)", name, value);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5778 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5779 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5780 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5781 return 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5782 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5783
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5784 static _Py_Identifier name_op[] = {
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5785 {0, "__lt__", 0},
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5786 {0, "__le__", 0},
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5787 {0, "__eq__", 0},
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5788 {0, "__ne__", 0},
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5789 {0, "__gt__", 0},
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5790 {0, "__ge__", 0}
44407
dda29e712815 Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents: 44351
diff changeset
5791 };
dda29e712815 Merge changes from 59576 from trunk to p3yk branch; these were skipped
Guido van Rossum <guido@python.org>
parents: 44351
diff changeset
5792
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5793 static PyObject *
57273
c5099818e0d4 Issue #6970: Remove redundant calls made when comparing objects.
Mark Dickinson <dickinsm@gmail.com>
parents: 55399
diff changeset
5794 slot_tp_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
5795 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5796 PyObject *func, *args, *res;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5797
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5798 func = lookup_method(self, &name_op[op]);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5799 if (func == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5800 PyErr_Clear();
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 71357
diff changeset
5801 Py_RETURN_NOTIMPLEMENTED;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5802 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5803 args = PyTuple_Pack(1, other);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5804 if (args == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5805 res = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5806 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5807 res = PyObject_Call(func, args, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5808 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5809 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5810 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5811 return res;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5812 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5813
19289
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
5814 static PyObject *
5c2bf6cde123 - Another big step in the right direction. All the overridable
Guido van Rossum <guido@python.org>
parents: 19253
diff changeset
5815 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
5816 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5817 PyObject *func, *res;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5818 _Py_IDENTIFIER(__iter__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5819
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5820 func = lookup_method(self, &PyId___iter__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5821 if (func != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5822 PyObject *args;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5823 args = res = PyTuple_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5824 if (args != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5825 res = PyObject_Call(func, args, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5826 Py_DECREF(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5827 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5828 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5829 return res;
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 PyErr_Clear();
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5832 func = lookup_method(self, &PyId___getitem__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5833 if (func == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5834 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5835 "'%.200s' object is not iterable",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5836 Py_TYPE(self)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5837 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5838 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5839 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5840 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
5841 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5842
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5843 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5844 slot_tp_iternext(PyObject *self)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5845 {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5846 _Py_IDENTIFIER(__next__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5847 return call_method(self, &PyId___next__, "()");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5848 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5849
19339
6130deeb4cc6 type_new(): look for __dynamic__ at the module level (after looking in
Guido van Rossum <guido@python.org>
parents: 19329
diff changeset
5850 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
5851 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
5852 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5853 PyTypeObject *tp = Py_TYPE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5854 PyObject *get;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5855 _Py_IDENTIFIER(__get__);
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5856
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5857 get = _PyType_LookupId(tp, &PyId___get__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5858 if (get == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5859 /* Avoid further slowdowns */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5860 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
5861 tp->tp_descr_get = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5862 Py_INCREF(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5863 return self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5864 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5865 if (obj == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5866 obj = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5867 if (type == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5868 type = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5869 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
5870 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5871
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5872 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5873 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
5874 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5875 PyObject *res;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5876 _Py_IDENTIFIER(__delete__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5877 _Py_IDENTIFIER(__set__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5878
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5879 if (value == NULL)
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5880 res = call_method(self, &PyId___delete__, "(O)", target);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5881 else
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5882 res = call_method(self, &PyId___set__, "(OO)", target, value);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5883 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5884 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5885 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5886 return 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5887 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5888
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5889 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5890 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
5891 {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5892 _Py_IDENTIFIER(__init__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5893 PyObject *meth = lookup_method(self, &PyId___init__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5894 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5895
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5896 if (meth == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5897 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5898 res = PyObject_Call(meth, args, kwds);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5899 Py_DECREF(meth);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5900 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5901 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5902 if (res != Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5903 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5904 "__init__() should return None, not '%.200s'",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5905 Py_TYPE(res)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5906 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5907 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5908 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5909 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5910 return 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5911 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5912
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5913 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5914 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
5915 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5916 PyObject *func;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5917 PyObject *newargs, *x;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5918 Py_ssize_t i, n;
75959
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5919
c67f3681e032 Issue #14383: Add _PyDict_GetItemId() and _PyDict_SetItemId() functions
Victor Stinner <victor.stinner@gmail.com>
parents: 75773
diff changeset
5920 func = _PyObject_GetAttrId((PyObject *)type, &PyId___new__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5921 if (func == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5922 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5923 assert(PyTuple_Check(args));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5924 n = PyTuple_GET_SIZE(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5925 newargs = PyTuple_New(n+1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5926 if (newargs == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5927 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5928 Py_INCREF(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5929 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
5930 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5931 x = PyTuple_GET_ITEM(args, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5932 Py_INCREF(x);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5933 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
5934 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5935 x = PyObject_Call(func, newargs, kwds);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5936 Py_DECREF(newargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5937 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5938 return x;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5939 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
5940
24678
71dca7c76fa2 A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents: 24653
diff changeset
5941 static void
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
5942 slot_tp_finalize(PyObject *self)
24678
71dca7c76fa2 A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents: 24653
diff changeset
5943 {
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5944 _Py_IDENTIFIER(__del__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5945 PyObject *del, *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5946 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
5947
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5948 /* Save the current exception, if any. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5949 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
5950
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5951 /* Execute __del__ method, if any. */
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74141
diff changeset
5952 del = lookup_maybe(self, &PyId___del__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5953 if (del != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5954 res = PyEval_CallObject(del, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5955 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5956 PyErr_WriteUnraisable(del);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5957 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5958 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5959 Py_DECREF(del);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5960 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5961
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5962 /* Restore the saved exception. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
5963 PyErr_Restore(error_type, error_value, error_traceback);
24678
71dca7c76fa2 A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents: 24653
diff changeset
5964 }
71dca7c76fa2 A modest speedup of object deallocation. call_finalizer() did rather
Guido van Rossum <guido@python.org>
parents: 24653
diff changeset
5965
20343
7bd12270dc3e Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents: 20328
diff changeset
5966
83059
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5967 /*
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5968 Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper functions.
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5969
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5970 The table is ordered by offsets relative to the 'PyHeapTypeObject' structure,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5971 which incorporates the additional structures used for numbers, sequences and
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5972 mappings. Note that multiple names may map to the same slot (e.g. __eq__,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5973 __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5974 (e.g. __str__ affects tp_str as well as tp_repr). The table is terminated with
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5975 an all-zero entry. (This table is further initialized in init_slotdefs().)
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
5976 */
20343
7bd12270dc3e Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents: 20328
diff changeset
5977
20586
9bd603d434f5 Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents: 20516
diff changeset
5978 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
5979
7bd12270dc3e Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents: 20328
diff changeset
5980 #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
5981 #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
5982 #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
5983 #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
5984 #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
5985 #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
5986 #undef UNSLOT
9bd603d434f5 Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents: 20516
diff changeset
5987 #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
5988 #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
5989 #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
5990
20586
9bd603d434f5 Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents: 20516
diff changeset
5991 #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
5992 {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
5993 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
5994 #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
5995 {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
5996 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
5997 #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
5998 {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
5999 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
6000 #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
6001 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
6002 #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
6003 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
6004 #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
6005 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
6006 #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
6007 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
6008 "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
6009 #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
6010 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
6011 "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
6012 #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
6013 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
6014 "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
6015 #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
6016 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
6017 "x." NAME "(y) <==> y" DOC "x")
35004
8880d91cdb09 fix object.__divmod__.__doc__
Anthony Baxter <anthonybaxter@gmail.com>
parents: 34958
diff changeset
6018 #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
6019 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
6020 "x." NAME "(y) <==> " DOC)
35004
8880d91cdb09 fix object.__divmod__.__doc__
Anthony Baxter <anthonybaxter@gmail.com>
parents: 34958
diff changeset
6021 #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
6022 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
6023 "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
6024
7bd12270dc3e Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents: 20328
diff changeset
6025 static slotdef slotdefs[] = {
83059
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6026 TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6027 TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6028 TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6029 TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6030 TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6031 "x.__repr__() <==> repr(x)"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6032 TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6033 "x.__hash__() <==> hash(x)"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6034 FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6035 "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6036 TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6037 "x.__str__() <==> str(x)"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6038 TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6039 wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6040 TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6041 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6042 "x.__setattr__('name', value) <==> x.name = value"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6043 TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6044 "x.__delattr__('name') <==> del x.name"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6045 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6046 "x.__lt__(y) <==> x<y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6047 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6048 "x.__le__(y) <==> x<=y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6049 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6050 "x.__eq__(y) <==> x==y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6051 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6052 "x.__ne__(y) <==> x!=y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6053 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6054 "x.__gt__(y) <==> x>y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6055 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6056 "x.__ge__(y) <==> x>=y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6057 TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6058 "x.__iter__() <==> iter(x)"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6059 TPSLOT("__next__", tp_iternext, slot_tp_iternext, wrap_next,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6060 "x.__next__() <==> next(x)"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6061 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6062 "descr.__get__(obj[, type]) -> value"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6063 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6064 "descr.__set__(obj, value)"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6065 TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6066 wrap_descr_delete, "descr.__delete__(obj)"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6067 FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6068 "x.__init__(...) initializes x; "
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6069 "see help(type(x)) for signature",
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6070 PyWrapperFlag_KEYWORDS),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6071 TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84725
diff changeset
6072 TPSLOT("__del__", tp_finalize, slot_tp_finalize, (wrapperfunc)wrap_del, ""),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6073
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6074 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
6075 "+"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6076 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
6077 "+"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6078 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
6079 "-"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6080 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
6081 "-"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6082 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
6083 "*"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6084 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
6085 "*"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6086 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
6087 "%"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6088 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
6089 "%"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6090 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
6091 "divmod(x, y)"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6092 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
6093 "divmod(y, x)"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6094 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
6095 "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
6096 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
6097 "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
6098 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
6099 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
6100 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
6101 "abs(x)"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6102 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
6103 "x != 0"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6104 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
6105 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
6106 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
6107 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
6108 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
6109 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
6110 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
6111 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
6112 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
6113 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
6114 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
6115 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
6116 "int(x)"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6117 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
6118 "float(x)"),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6119 IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6120 wrap_binaryfunc, "+="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6121 IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6122 wrap_binaryfunc, "-="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6123 IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6124 wrap_binaryfunc, "*="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6125 IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6126 wrap_binaryfunc, "%="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6127 IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6128 wrap_binaryfunc, "**="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6129 IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6130 wrap_binaryfunc, "<<="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6131 IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6132 wrap_binaryfunc, ">>="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6133 IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6134 wrap_binaryfunc, "&="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6135 IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6136 wrap_binaryfunc, "^="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6137 IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
73500
9fbaa190f011 Issue #13161: fix doc strings of __i*__ operators
Eli Bendersky <eliben@gmail.com>
parents: 73061
diff changeset
6138 wrap_binaryfunc, "|="),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6139 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
6140 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
6141 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
6142 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
6143 IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6144 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
6145 IBSLOT("__itruediv__", nb_inplace_true_divide,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6146 slot_nb_inplace_true_divide, wrap_binaryfunc, "/"),
83059
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6147 NBSLOT("__index__", nb_index, slot_nb_index, wrap_unaryfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6148 "x[y:z] <==> x[y.__index__():z.__index__()]"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6149
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6150 MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6151 "x.__len__() <==> len(x)"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6152 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6153 wrap_binaryfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6154 "x.__getitem__(y) <==> x[y]"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6155 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6156 wrap_objobjargproc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6157 "x.__setitem__(i, y) <==> x[i]=y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6158 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6159 wrap_delitem,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6160 "x.__delitem__(y) <==> del x[y]"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6161
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6162 SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6163 "x.__len__() <==> len(x)"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6164 /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL.
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6165 The logic in abstract.c always falls back to nb_add/nb_multiply in
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6166 this case. Defining both the nb_* and the sq_* slots to call the
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6167 user-defined methods has unexpected side-effects, as shown by
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6168 test_descr.notimplemented() */
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6169 SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6170 "x.__add__(y) <==> x+y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6171 SQSLOT("__mul__", sq_repeat, NULL, wrap_indexargfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6172 "x.__mul__(n) <==> x*n"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6173 SQSLOT("__rmul__", sq_repeat, NULL, wrap_indexargfunc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6174 "x.__rmul__(n) <==> n*x"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6175 SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6176 "x.__getitem__(y) <==> x[y]"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6177 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6178 "x.__setitem__(i, y) <==> x[i]=y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6179 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6180 "x.__delitem__(y) <==> del x[y]"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6181 SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6182 "x.__contains__(y) <==> y in x"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6183 SQSLOT("__iadd__", sq_inplace_concat, NULL,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6184 wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6185 SQSLOT("__imul__", sq_inplace_repeat, NULL,
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6186 wrap_indexargfunc, "x.__imul__(y) <==> x*=y"),
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6187
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6188 {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
6189 };
7bd12270dc3e Halfway checkin. This is still messy, but it's beginning to address
Guido van Rossum <guido@python.org>
parents: 20328
diff changeset
6190
22834
0908729e94e0 A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents: 22804
diff changeset
6191 /* 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
6192 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
6193 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
6194 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
6195 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
6196 static void **
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36169
diff changeset
6197 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
6198 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6199 char *ptr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6200 long offset = ioffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6201
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6202 /* 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
6203 assert(offset >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6204 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
6205 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
6206 ptr = (char *)type->tp_as_sequence;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6207 offset -= offsetof(PyHeapTypeObject, as_sequence);
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 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
6210 ptr = (char *)type->tp_as_mapping;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6211 offset -= offsetof(PyHeapTypeObject, as_mapping);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6212 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6213 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
6214 ptr = (char *)type->tp_as_number;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6215 offset -= offsetof(PyHeapTypeObject, as_number);
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 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6218 ptr = (char *)type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6219 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6220 if (ptr != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6221 ptr += offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6222 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
6223 }
19036
3a7d67ee1011 Cosmetics:
Guido van Rossum <guido@python.org>
parents: 19011
diff changeset
6224
22834
0908729e94e0 A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents: 22804
diff changeset
6225 /* 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
6226 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
6227 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
6228 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
6229 #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
6230
0908729e94e0 A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents: 22804
diff changeset
6231 /* 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
6232 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
6233 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
6234 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
6235 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6236 /* 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
6237
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6238 /* 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
6239 static PyObject *pname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6240 static slotdef *ptrs[MAX_EQUIV];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6241 slotdef *p, **pp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6242 void **res, **ptr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6243
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6244 if (pname != name) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6245 /* 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
6246 pname = name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6247 pp = ptrs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6248 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
6249 if (p->name_strobj == name)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6250 *pp++ = p;
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 *pp = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6253 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6254
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6255 /* 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
6256 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
6257 res = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6258 for (pp = ptrs; *pp; pp++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6259 ptr = slotptr(type, (*pp)->offset);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6260 if (ptr == NULL || *ptr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6261 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6262 if (res != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6263 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6264 res = ptr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6265 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6266 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
6267 }
0908729e94e0 A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents: 22804
diff changeset
6268
28403
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6269 /* 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
6270 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
6271 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
6272 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
6273 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
6274 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
6275 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
6276 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
6277 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6278 PyObject *descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6279 PyWrapperDescrObject *d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6280 void *generic = NULL, *specific = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6281 int use_generic = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6282 int offset = p->offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6283 void **ptr = slotptr(type, offset);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6284
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6285 if (ptr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6286 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6287 ++p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6288 } while (p->offset == offset);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6289 return p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6290 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6291 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6292 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
6293 if (descr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6294 if (ptr == (void**)&type->tp_iternext) {
79048
e9e6e5104936 Silence compiler warnings on Solaris 10 via explicit (void *) casts.
Trent Nelson <trent@trent.me>
parents: 78964
diff changeset
6295 specific = (void *)_PyObject_NextNotImplemented;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6296 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6297 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6298 }
76518
971865f12377 don't use a slot wrapper from a different special method (closes #14658)
Benjamin Peterson <benjamin@python.org>
parents: 76059
diff changeset
6299 if (Py_TYPE(descr) == &PyWrapperDescr_Type &&
971865f12377 don't use a slot wrapper from a different special method (closes #14658)
Benjamin Peterson <benjamin@python.org>
parents: 76059
diff changeset
6300 ((PyWrapperDescrObject *)descr)->d_base->name_strobj == p->name_strobj) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6301 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
6302 if (tptr == NULL || tptr == ptr)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6303 generic = p->function;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6304 d = (PyWrapperDescrObject *)descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6305 if (d->d_base->wrapper == p->wrapper &&
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59538
diff changeset
6306 PyType_IsSubtype(type, PyDescr_TYPE(d)))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6307 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6308 if (specific == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6309 specific == d->d_wrapped)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6310 specific = d->d_wrapped;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6311 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6312 use_generic = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6313 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6314 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6315 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
6316 PyCFunction_GET_FUNCTION(descr) ==
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6317 (PyCFunction)tp_new_wrapper &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6318 ptr == (void**)&type->tp_new)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6319 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6320 /* 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
6321 so must be special-cased differently.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6322 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
6323 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
6324 __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
6325 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
6326 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
6327 PyType_GenericNew), after performing various
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6328 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
6329 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
6330 up instance creation tremendously. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6331 specific = (void *)type->tp_new;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6332 /* 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
6333 in this reasoning that requires additional
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6334 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
6335 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
6336 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6337 else if (descr == Py_None &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6338 ptr == (void**)&type->tp_hash) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6339 /* 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
6340 to prevent inheritance of the default
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6341 implementation from object.__hash__ */
79048
e9e6e5104936 Silence compiler warnings on Solaris 10 via explicit (void *) casts.
Trent Nelson <trent@trent.me>
parents: 78964
diff changeset
6342 specific = (void *)PyObject_HashNotImplemented;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6343 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6344 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6345 use_generic = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6346 generic = p->function;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6347 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6348 } while ((++p)->offset == offset);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6349 if (specific && !use_generic)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6350 *ptr = specific;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6351 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6352 *ptr = generic;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6353 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
6354 }
0908729e94e0 A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents: 22804
diff changeset
6355
28403
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6356 /* 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
6357 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
6358 static int
28403
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6359 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
6360 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6361 slotdef **pp = (slotdef **)data;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6362
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6363 for (; *pp; pp++)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6364 update_one_slot(type, *pp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6365 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
6366 }
be08734b0afd Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents: 20345
diff changeset
6367
22834
0908729e94e0 A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents: 22804
diff changeset
6368 /* 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
6369 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
6370 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
6371 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
6372 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6373 slotdef *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6374 static int initialized = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6375
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6376 if (initialized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6377 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6378 for (p = slotdefs; p->name; p++) {
83059
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6379 /* Slots must be ordered by their offset in the PyHeapTypeObject. */
9431a092b708 list slotdefs in offset order rather than sorting them (closes #17610)
Benjamin Peterson <benjamin@python.org>
parents: 82260
diff changeset
6380 assert(!p[1].name || p->offset <= p[1].offset);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6381 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
6382 if (!p->name_strobj)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6383 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
6384 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6385 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
6386 }
be08734b0afd Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents: 20345
diff changeset
6387
22834
0908729e94e0 A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents: 22804
diff changeset
6388 /* 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
6389 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
6390 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
6391 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6392 slotdef *ptrs[MAX_EQUIV];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6393 slotdef *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6394 slotdef **pp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6395 int offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6396
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6397 /* 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
6398 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
6399 update_subclasses() recursion below, but carefully:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6400 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
6401 recursing into subclasses. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6402 PyType_Modified(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6403
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6404 init_slotdefs();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6405 pp = ptrs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6406 for (p = slotdefs; p->name; p++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6407 /* XXX assume name is interned! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6408 if (p->name_strobj == name)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6409 *pp++ = p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6410 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6411 *pp = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6412 for (pp = ptrs; *pp; pp++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6413 p = *pp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6414 offset = p->offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6415 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
6416 --p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6417 *pp = p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6418 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6419 if (ptrs[0] == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6420 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
6421 return update_subclasses(type, name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6422 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
6423 }
be08734b0afd Another step in the right direction: when a new class's attribute
Guido van Rossum <guido@python.org>
parents: 20345
diff changeset
6424
22834
0908729e94e0 A much revised version of SF patch 514662, by Naofumi Honda. This
Guido van Rossum <guido@python.org>
parents: 22804
diff changeset
6425 /* 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
6426 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
6427 dict. */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
6428 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
6429 fixup_slot_dispatchers(PyTypeObject *type)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18068
diff changeset
6430 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6431 slotdef *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6432
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6433 init_slotdefs();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6434 for (p = slotdefs; p->name; )
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6435 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
6436 }
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6437
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
6438 static void
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
6439 update_all_slots(PyTypeObject* type)
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
6440 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6441 slotdef *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6442
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6443 init_slotdefs();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6444 for (p = slotdefs; p->name; p++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6445 /* 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
6446 update_slot(type, p->name_strobj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6447 }
26421
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
6448 }
9d6aed2e60e2 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 26410
diff changeset
6449
28403
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6450 /* 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
6451 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
6452 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
6453
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6454 static int
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6455 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
6456 update_callback callback, void *data)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6457 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6458 if (callback(type, data) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6459 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6460 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
6461 }
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6462
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6463 static int
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6464 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
6465 update_callback callback, void *data)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6466 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6467 PyTypeObject *subclass;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6468 PyObject *ref, *subclasses, *dict;
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
6469 Py_ssize_t i;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6470
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6471 subclasses = type->tp_subclasses;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6472 if (subclasses == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6473 return 0;
86758
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
6474 assert(PyDict_CheckExact(subclasses));
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
6475 i = 0;
a7f1ce6fe293 Issue #17936: Fix O(n**2) behaviour when adding or removing many subclasses of a given type.
Antoine Pitrou <solipsis@pitrou.net>
parents: 86733
diff changeset
6476 while (PyDict_Next(subclasses, &i, NULL, &ref)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6477 assert(PyWeakref_CheckRef(ref));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6478 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6479 assert(subclass != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6480 if ((PyObject *)subclass == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6481 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6482 assert(PyType_Check(subclass));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6483 /* Avoid recursing down into unaffected classes */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6484 dict = subclass->tp_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6485 if (dict != NULL && PyDict_Check(dict) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6486 PyDict_GetItem(dict, name) != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6487 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6488 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
6489 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6490 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6491 return 0;
28403
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6492 }
63ed85290413 Refactoring: rename update_these_slots() into update_subclasses() and
Guido van Rossum <guido@python.org>
parents: 28396
diff changeset
6493
20586
9bd603d434f5 Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents: 20516
diff changeset
6494 /* 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
6495 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
6496 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
6497 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
6498 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
6499 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
6500 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
6501 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
6502 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
6503
68585
bf94b6a73fc8 #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 67653
diff changeset
6504 In the latter case, the first slotdef entry encountered 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
6505 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
6506 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
6507 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
6508 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
6509 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
6510 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
6511 wins.
23830
ade1d56109a8 Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents: 23756
diff changeset
6512
ade1d56109a8 Hopefully this addresses the remaining issues of SF bugs 459235 and
Guido van Rossum <guido@python.org>
parents: 23756
diff changeset
6513 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
6514 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
6515 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
6516 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
6517 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
6518 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
6519 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
6520 (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
6521 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
6522 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
6523
9bd603d434f5 Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents: 20516
diff changeset
6524 static int
9bd603d434f5 Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents: 20516
diff changeset
6525 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
6526 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6527 PyObject *dict = type->tp_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6528 slotdef *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6529 PyObject *descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6530 void **ptr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6531
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6532 init_slotdefs();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6533 for (p = slotdefs; p->name; p++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6534 if (p->wrapper == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6535 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6536 ptr = slotptr(type, p->offset);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6537 if (!ptr || !*ptr)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6538 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6539 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
6540 continue;
79048
e9e6e5104936 Silence compiler warnings on Solaris 10 via explicit (void *) casts.
Trent Nelson <trent@trent.me>
parents: 78964
diff changeset
6541 if (*ptr == (void *)PyObject_HashNotImplemented) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6542 /* 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
6543 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
6544 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
6545 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
6546 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6547 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6548 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6549 descr = PyDescr_NewWrapper(type, p, *ptr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6550 if (descr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6551 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6552 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
6553 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6554 Py_DECREF(descr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6555 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6556 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6557 if (type->tp_new != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6558 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
6559 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6560 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6561 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
6562 }
9bd603d434f5 Big internal change that should have no external effects: unify the
Guido van Rossum <guido@python.org>
parents: 20516
diff changeset
6563
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6564
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6565 /* Cooperative 'super' */
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6566
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6567 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6568 PyObject_HEAD
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6569 PyTypeObject *type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6570 PyObject *obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6571 PyTypeObject *obj_type;
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6572 } superobject;
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6573
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19970
diff changeset
6574 static PyMemberDef super_members[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6575 {"__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
6576 "the class invoking super()"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6577 {"__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
6578 "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
6579 {"__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
6580 "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
6581 {0}
19630
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
6582 };
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
6583
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6584 static void
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6585 super_dealloc(PyObject *self)
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6586 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6587 superobject *su = (superobject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6588
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6589 _PyObject_GC_UNTRACK(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6590 Py_XDECREF(su->obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6591 Py_XDECREF(su->type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6592 Py_XDECREF(su->obj_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6593 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
6594 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6595
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6596 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
6597 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
6598 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6599 superobject *su = (superobject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6600
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6601 if (su->obj_type)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6602 return PyUnicode_FromFormat(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6603 "<super: <class '%s'>, <%s object>>",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6604 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
6605 su->obj_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6606 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6607 return PyUnicode_FromFormat(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6608 "<super: <class '%s'>, NULL>",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6609 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
6610 }
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
6611
ae056f114974 Give 'super' a decent repr(), and readonly attributes to access the
Guido van Rossum <guido@python.org>
parents: 19618
diff changeset
6612 static PyObject *
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6613 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
6614 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6615 superobject *su = (superobject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6616 int skip = su->obj_type == NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6617
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6618 if (!skip) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6619 /* 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
6620 (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
6621 skip = (PyUnicode_Check(name) &&
86980
77bebcf5c4cf Issue #19512: add _PyUnicode_CompareWithId() function
Victor Stinner <victor.stinner@gmail.com>
parents: 86969
diff changeset
6622 PyUnicode_GET_LENGTH(name) == 9 &&
77bebcf5c4cf Issue #19512: add _PyUnicode_CompareWithId() function
Victor Stinner <victor.stinner@gmail.com>
parents: 86969
diff changeset
6623 _PyUnicode_CompareWithId(name, &PyId___class__) == 0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6624 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6625
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6626 if (!skip) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6627 PyObject *mro, *res, *tmp, *dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6628 PyTypeObject *starttype;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6629 descrgetfunc f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6630 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6631
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6632 starttype = su->obj_type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6633 mro = starttype->tp_mro;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6634
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6635 if (mro == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6636 n = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6637 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6638 assert(PyTuple_Check(mro));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6639 n = PyTuple_GET_SIZE(mro);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6640 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6641 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6642 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
6643 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6644 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6645 i++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6646 res = NULL;
75497
21e245ed3747 Close #14199: _PyType_Lookup() and super_getattro() keep a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75484
diff changeset
6647 /* keep a strong reference to mro because starttype->tp_mro can be
21e245ed3747 Close #14199: _PyType_Lookup() and super_getattro() keep a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75484
diff changeset
6648 replaced during PyDict_GetItem(dict, name) */
21e245ed3747 Close #14199: _PyType_Lookup() and super_getattro() keep a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75484
diff changeset
6649 Py_INCREF(mro);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6650 for (; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6651 tmp = PyTuple_GET_ITEM(mro, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6652 if (PyType_Check(tmp))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6653 dict = ((PyTypeObject *)tmp)->tp_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6654 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6655 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6656 res = PyDict_GetItem(dict, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6657 if (res != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6658 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6659 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
6660 if (f != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6661 tmp = f(res,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6662 /* Only pass 'obj' param if
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6663 this is instance-mode super
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6664 (See SF ID #743627)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6665 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6666 (su->obj == (PyObject *)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6667 su->obj_type
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6668 ? (PyObject *)NULL
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6669 : su->obj),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6670 (PyObject *)starttype);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6671 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6672 res = tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6673 }
75497
21e245ed3747 Close #14199: _PyType_Lookup() and super_getattro() keep a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75484
diff changeset
6674 Py_DECREF(mro);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6675 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6676 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6677 }
75497
21e245ed3747 Close #14199: _PyType_Lookup() and super_getattro() keep a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75484
diff changeset
6678 Py_DECREF(mro);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6679 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6680 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
6681 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6682
27831
6b5696541ba4 Implement another useful feature for proxies: in super(X, x), x may
Guido van Rossum <guido@python.org>
parents: 27821
diff changeset
6683 static PyTypeObject *
21151
918b57354d87 Address SF patch #480716 as well as related issues.
Guido van Rossum <guido@python.org>
parents: 21142
diff changeset
6684 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
6685 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6686 /* 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
6687
73949
021e5bb297d1 Issue #13575: there is only one class type.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 73738
diff changeset
6688 obj can be a class, or an instance of one:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6689
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6690 - 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
6691 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
6692
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6693 - 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
6694 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
6695
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6696 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
6697 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
6698 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
6699 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6700
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6701 /* 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
6702 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
6703 Py_INCREF(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6704 return (PyTypeObject *)obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6705 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6706
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6707 /* Normal case */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6708 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
6709 Py_INCREF(Py_TYPE(obj));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6710 return Py_TYPE(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6711 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6712 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6713 /* Try the slow way */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6714 PyObject *class_attr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6715
72913
c060261a65b8 Use GetAttrId directly. Proposed by Amaury.
Martin v. Löwis <martin@v.loewis.de>
parents: 72848
diff changeset
6716 class_attr = _PyObject_GetAttrId(obj, &PyId___class__);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6717 if (class_attr != NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6718 PyType_Check(class_attr) &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6719 (PyTypeObject *)class_attr != Py_TYPE(obj))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6720 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6721 int ok = PyType_IsSubtype(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6722 (PyTypeObject *)class_attr, type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6723 if (ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6724 return (PyTypeObject *)class_attr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6725 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6726
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6727 if (class_attr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6728 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6729 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6730 Py_DECREF(class_attr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6731 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6732
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6733 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6734 "super(type, obj): "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6735 "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
6736 return NULL;
21151
918b57354d87 Address SF patch #480716 as well as related issues.
Guido van Rossum <guido@python.org>
parents: 21142
diff changeset
6737 }
918b57354d87 Address SF patch #480716 as well as related issues.
Guido van Rossum <guido@python.org>
parents: 21142
diff changeset
6738
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6739 static PyObject *
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6740 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
6741 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6742 superobject *su = (superobject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6743 superobject *newobj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6744
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6745 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
6746 /* 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
6747 Py_INCREF(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6748 return self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6749 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6750 if (Py_TYPE(su) != &PySuper_Type)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6751 /* 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
6752 call its type */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6753 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
6754 su->type, obj, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6755 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6756 /* Inline the common case */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6757 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
6758 if (obj_type == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6759 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6760 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
6761 NULL, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6762 if (newobj == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6763 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6764 Py_INCREF(su->type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6765 Py_INCREF(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6766 newobj->type = su->type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6767 newobj->obj = obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6768 newobj->obj_type = obj_type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6769 return (PyObject *)newobj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6770 }
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6771 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6772
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6773 static int
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6774 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
6775 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6776 superobject *su = (superobject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6777 PyTypeObject *type = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6778 PyObject *obj = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6779 PyTypeObject *obj_type = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6780
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6781 if (!_PyArg_NoKeywords("super", kwds))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6782 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6783 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
6784 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6785
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6786 if (type == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6787 /* 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
6788 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
6789 PyFrameObject *f = PyThreadState_GET()->frame;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6790 PyCodeObject *co = f->f_code;
67347
3bf4d9f1660a Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66664
diff changeset
6791 Py_ssize_t i, n;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6792 if (co == NULL) {
78832
e2e4a0a49d2e Make super() internal errors RuntimeError instead of SystemError (closes #15839)
Benjamin Peterson <benjamin@python.org>
parents: 78605
diff changeset
6793 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6794 "super(): no code object");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6795 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6796 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6797 if (co->co_argcount == 0) {
78832
e2e4a0a49d2e Make super() internal errors RuntimeError instead of SystemError (closes #15839)
Benjamin Peterson <benjamin@python.org>
parents: 78605
diff changeset
6798 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6799 "super(): no arguments");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6800 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6801 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6802 obj = f->f_localsplus[0];
83772
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6803 if (obj == NULL && co->co_cell2arg) {
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6804 /* The first argument might be a cell. */
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6805 n = PyTuple_GET_SIZE(co->co_cellvars);
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6806 for (i = 0; i < n; i++) {
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6807 if (co->co_cell2arg[i] == 0) {
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6808 PyObject *cell = f->f_localsplus[co->co_nlocals + i];
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6809 assert(PyCell_Check(cell));
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6810 obj = PyCell_GET(cell);
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6811 break;
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6812 }
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6813 }
2b4b289c1abb when arguments are cells clear the locals slot (backport of #17927)
Benjamin Peterson <benjamin@python.org>
parents: 83612
diff changeset
6814 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6815 if (obj == NULL) {
78832
e2e4a0a49d2e Make super() internal errors RuntimeError instead of SystemError (closes #15839)
Benjamin Peterson <benjamin@python.org>
parents: 78605
diff changeset
6816 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6817 "super(): arg[0] deleted");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6818 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6819 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6820 if (co->co_freevars == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6821 n = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6822 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6823 assert(PyTuple_Check(co->co_freevars));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6824 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
6825 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6826 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6827 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
6828 assert(PyUnicode_Check(name));
86980
77bebcf5c4cf Issue #19512: add _PyUnicode_CompareWithId() function
Victor Stinner <victor.stinner@gmail.com>
parents: 86969
diff changeset
6829 if (!_PyUnicode_CompareWithId(name, &PyId___class__)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6830 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
6831 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
6832 PyObject *cell = f->f_localsplus[index];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6833 if (cell == NULL || !PyCell_Check(cell)) {
78832
e2e4a0a49d2e Make super() internal errors RuntimeError instead of SystemError (closes #15839)
Benjamin Peterson <benjamin@python.org>
parents: 78605
diff changeset
6834 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6835 "super(): bad __class__ cell");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6836 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6837 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6838 type = (PyTypeObject *) PyCell_GET(cell);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6839 if (type == NULL) {
78832
e2e4a0a49d2e Make super() internal errors RuntimeError instead of SystemError (closes #15839)
Benjamin Peterson <benjamin@python.org>
parents: 78605
diff changeset
6840 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6841 "super(): empty __class__ cell");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6842 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6843 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6844 if (!PyType_Check(type)) {
78832
e2e4a0a49d2e Make super() internal errors RuntimeError instead of SystemError (closes #15839)
Benjamin Peterson <benjamin@python.org>
parents: 78605
diff changeset
6845 PyErr_Format(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6846 "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
6847 Py_TYPE(type)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6848 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6849 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6850 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6851 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6852 }
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42081
diff changeset
6853 if (type == NULL) {
78832
e2e4a0a49d2e Make super() internal errors RuntimeError instead of SystemError (closes #15839)
Benjamin Peterson <benjamin@python.org>
parents: 78605
diff changeset
6854 PyErr_SetString(PyExc_RuntimeError,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6855 "super(): __class__ cell not found");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6856 return -1;
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42081
diff changeset
6857 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6858 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6859
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6860 if (obj == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6861 obj = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6862 if (obj != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6863 obj_type = supercheck(type, obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6864 if (obj_type == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6865 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6866 Py_INCREF(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6867 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6868 Py_INCREF(type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6869 su->type = type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6870 su->obj = obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6871 su->obj_type = obj_type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6872 return 0;
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6873 }
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6874
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23830
diff changeset
6875 PyDoc_STRVAR(super_doc,
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42081
diff changeset
6876 "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
6877 "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
6878 "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
6879 "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
6880 "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
6881 "class C(B):\n"
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6882 " def meth(self, arg):\n"
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6883 " super().meth(arg)\n"
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42081
diff changeset
6884 "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
6885 "class C(B):\n"
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42081
diff changeset
6886 " @classmethod\n"
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42081
diff changeset
6887 " def cmeth(cls, arg):\n"
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6888 " 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
6889
20220
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20204
diff changeset
6890 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
6891 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
6892 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6893 superobject *su = (superobject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6894
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6895 Py_VISIT(su->obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6896 Py_VISIT(su->type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6897 Py_VISIT(su->obj_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6898
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6899 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
6900 }
0b99174d6b17 Add Garbage Collection support to new-style classes (not yet to their
Guido van Rossum <guido@python.org>
parents: 20204
diff changeset
6901
19469
b3c92f013869 Add 'super', another new object type with magical properties.
Guido van Rossum <guido@python.org>
parents: 19464
diff changeset
6902 PyTypeObject PySuper_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6903 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6904 "super", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6905 sizeof(superobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6906 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6907 /* methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6908 super_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6909 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6910 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6911 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6912 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6913 super_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6914 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6915 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6916 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6917 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6918 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6919 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6920 super_getattro, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6921 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6922 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6923 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
6924 Py_TPFLAGS_BASETYPE, /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6925 super_doc, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6926 super_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6927 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6928 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6929 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6930 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6931 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6932 0, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6933 super_members, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6934 0, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6935 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6936 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6937 super_descr_get, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6938 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6939 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6940 super_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6941 PyType_GenericAlloc, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6942 PyType_GenericNew, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59858
diff changeset
6943 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
6944 };