Mercurial > cpython-lru_cache-weakref
annotate Objects/object.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 | 7d6c27fa7f32 |
| children |
| rev | line source |
|---|---|
| 145 | 1 |
|
70802
43605330864b
quaint and completely out of date comment
Benjamin Peterson <benjamin@python.org>
parents:
70801
diff
changeset
|
2 /* Generic object operations; and implementation of None */ |
| 6 | 3 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5006
diff
changeset
|
4 #include "Python.h" |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
5 #include "frameobject.h" |
| 6 | 6 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
7 #ifdef __cplusplus |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
8 extern "C" { |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
9 #endif |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
10 |
|
86999
01c4a0af73cf
Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents:
86981
diff
changeset
|
11 _Py_IDENTIFIER(Py_Repr); |
|
01c4a0af73cf
Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents:
86981
diff
changeset
|
12 _Py_IDENTIFIER(__bytes__); |
|
01c4a0af73cf
Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents:
86981
diff
changeset
|
13 _Py_IDENTIFIER(__dir__); |
|
01c4a0af73cf
Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents:
86981
diff
changeset
|
14 _Py_IDENTIFIER(__isabstractmethod__); |
|
01c4a0af73cf
Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents:
86981
diff
changeset
|
15 _Py_IDENTIFIER(builtins); |
|
01c4a0af73cf
Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents:
86981
diff
changeset
|
16 |
|
24184
c4dcb80f48ea
object.h special-build macro minefield: renamed all the new lexical
Tim Peters <tim.peters@gmail.com>
parents:
24155
diff
changeset
|
17 #ifdef Py_REF_DEBUG |
|
36838
dedc2c94d112
Oops, forgot to include this in the last checkin.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36759
diff
changeset
|
18 Py_ssize_t _Py_RefTotal; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
19 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
20 Py_ssize_t |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
21 _Py_GetRefTotal(void) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
22 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
23 PyObject *o; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
24 Py_ssize_t total = _Py_RefTotal; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
25 /* ignore the references to the dummy object of the dicts and sets |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
26 because they are not reliable and not useful (now that the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
27 hash table code is well-tested) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
28 o = _PyDict_Dummy(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
29 if (o != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
30 total -= o->ob_refcnt; |
|
85366
2f1bac39565a
Issue #18772: fix the gdb plugin after the set implementation changes
Antoine Pitrou <solipsis@pitrou.net>
parents:
85354
diff
changeset
|
31 o = _PySet_Dummy; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
32 if (o != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
33 total -= o->ob_refcnt; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
34 return total; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
35 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
36 #endif /* Py_REF_DEBUG */ |
| 6 | 37 |
| 86 | 38 /* Object allocation routines used by NEWOBJ and NEWVAROBJ macros. |
| 39 These are used by the individual routines for object creation. | |
| 40 Do not call them otherwise, they do not initialize the object! */ | |
| 6 | 41 |
|
28387
983e9291a7b4
When Py_TRACE_REFS is defined, a list of all live objects is maintained in
Tim Peters <tim.peters@gmail.com>
parents:
28320
diff
changeset
|
42 #ifdef Py_TRACE_REFS |
|
28396
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
43 /* Head of circular doubly-linked list of all objects. These are linked |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
44 * together via the _ob_prev and _ob_next members of a PyObject, which |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
45 * exist only in a Py_TRACE_REFS build. |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
46 */ |
|
28387
983e9291a7b4
When Py_TRACE_REFS is defined, a list of all live objects is maintained in
Tim Peters <tim.peters@gmail.com>
parents:
28320
diff
changeset
|
47 static PyObject refchain = {&refchain, &refchain}; |
|
28389
4ede57a42c62
Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents:
28388
diff
changeset
|
48 |
|
28396
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
49 /* Insert op at the front of the list of all objects. If force is true, |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
50 * op is added even if _ob_prev and _ob_next are non-NULL already. If |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
51 * force is false amd _ob_prev or _ob_next are non-NULL, do nothing. |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
52 * force should be true if and only if op points to freshly allocated, |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
53 * uninitialized memory, or you've unlinked op from the list and are |
| 28397 | 54 * relinking it into the front. |
|
28396
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
55 * Note that objects are normally added to the list via _Py_NewReference, |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
56 * which is called by PyObject_Init. Not all objects are initialized that |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
57 * way, though; exceptions include statically allocated type objects, and |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
58 * statically allocated singletons (like Py_True and Py_None). |
|
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
59 */ |
|
28389
4ede57a42c62
Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents:
28388
diff
changeset
|
60 void |
|
28396
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
61 _Py_AddToAllObjects(PyObject *op, int force) |
|
28389
4ede57a42c62
Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents:
28388
diff
changeset
|
62 { |
|
28396
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
63 #ifdef Py_DEBUG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
64 if (!force) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
65 /* If it's initialized memory, op must be in or out of |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
66 * the list unambiguously. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
67 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
68 assert((op->_ob_prev == NULL) == (op->_ob_next == NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
69 } |
|
28396
d56282c28a1e
Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents:
28389
diff
changeset
|
70 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
71 if (force || op->_ob_prev == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
72 op->_ob_next = refchain._ob_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
73 op->_ob_prev = &refchain; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
74 refchain._ob_next->_ob_prev = op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
75 refchain._ob_next = op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
76 } |
|
28389
4ede57a42c62
Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents:
28388
diff
changeset
|
77 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
78 #endif /* Py_TRACE_REFS */ |
|
28387
983e9291a7b4
When Py_TRACE_REFS is defined, a list of all live objects is maintained in
Tim Peters <tim.peters@gmail.com>
parents:
28320
diff
changeset
|
79 |
|
1347
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
80 #ifdef COUNT_ALLOCS |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5006
diff
changeset
|
81 static PyTypeObject *type_list; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
82 /* All types are added to type_list, at least when |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
83 they get one object created. That makes them |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
84 immortal, which unfortunately contributes to |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
85 garbage itself. If unlist_types_without_objects |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
86 is set, they will be removed from the type_list |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
87 once the last object is deallocated. */ |
|
50735
27db82a5cda9
Merged revisions 68381 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50374
diff
changeset
|
88 static int unlist_types_without_objects; |
|
27db82a5cda9
Merged revisions 68381 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50374
diff
changeset
|
89 extern Py_ssize_t tuple_zero_allocs, fast_tuple_allocs; |
|
27db82a5cda9
Merged revisions 68381 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50374
diff
changeset
|
90 extern Py_ssize_t quick_int_allocs, quick_neg_int_allocs; |
|
27db82a5cda9
Merged revisions 68381 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50374
diff
changeset
|
91 extern Py_ssize_t null_strings, one_strings; |
|
1347
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
92 void |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
93 dump_counts(FILE* f) |
|
1347
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
94 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
95 PyTypeObject *tp; |
|
1347
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
96 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
97 for (tp = type_list; tp; tp = tp->tp_next) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
98 fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
99 "freed: %" PY_FORMAT_SIZE_T "d, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
100 "max in use: %" PY_FORMAT_SIZE_T "d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
101 tp->tp_name, tp->tp_allocs, tp->tp_frees, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
102 tp->tp_maxalloc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
103 fprintf(f, "fast tuple allocs: %" PY_FORMAT_SIZE_T "d, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
104 "empty: %" PY_FORMAT_SIZE_T "d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
105 fast_tuple_allocs, tuple_zero_allocs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
106 fprintf(f, "fast int allocs: pos: %" PY_FORMAT_SIZE_T "d, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
107 "neg: %" PY_FORMAT_SIZE_T "d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
108 quick_int_allocs, quick_neg_int_allocs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
109 fprintf(f, "null strings: %" PY_FORMAT_SIZE_T "d, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
110 "1-strings: %" PY_FORMAT_SIZE_T "d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
111 null_strings, one_strings); |
|
1347
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
112 } |
|
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
113 |
|
3024
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
114 PyObject * |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
115 get_counts(void) |
|
3024
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
116 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
117 PyTypeObject *tp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
118 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
119 PyObject *v; |
|
3024
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
120 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
121 result = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
122 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
123 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
124 for (tp = type_list; tp; tp = tp->tp_next) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
125 v = Py_BuildValue("(snnn)", tp->tp_name, tp->tp_allocs, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
126 tp->tp_frees, tp->tp_maxalloc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
127 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
128 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
129 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
130 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
131 if (PyList_Append(result, v) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
132 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
133 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
134 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
135 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
136 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
137 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
138 return result; |
|
3024
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
139 } |
|
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
140 |
|
1347
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
141 void |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
142 inc_count(PyTypeObject *tp) |
|
1347
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
143 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
144 if (tp->tp_next == NULL && tp->tp_prev == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
145 /* first time; insert in linked list */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
146 if (tp->tp_next != NULL) /* sanity check */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
147 Py_FatalError("XXX inc_count sanity check"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
148 if (type_list) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
149 type_list->tp_prev = tp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
150 tp->tp_next = type_list; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
151 /* Note that as of Python 2.2, heap-allocated type objects |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
152 * can go away, but this code requires that they stay alive |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
153 * until program exit. That's why we're careful with |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
154 * refcounts here. type_list gets a new reference to tp, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
155 * while ownership of the reference type_list used to hold |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
156 * (if any) was transferred to tp->tp_next in the line above. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
157 * tp is thus effectively immortal after this. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
158 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
159 Py_INCREF(tp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
160 type_list = tp; |
|
28388
f81239c12c60
Oops! Used a wrong preprocessor symbol.
Tim Peters <tim.peters@gmail.com>
parents:
28387
diff
changeset
|
161 #ifdef Py_TRACE_REFS |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
162 /* Also insert in the doubly-linked list of all objects, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
163 * if not already there. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
164 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
165 _Py_AddToAllObjects((PyObject *)tp, 0); |
|
28387
983e9291a7b4
When Py_TRACE_REFS is defined, a list of all live objects is maintained in
Tim Peters <tim.peters@gmail.com>
parents:
28320
diff
changeset
|
166 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
167 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
168 tp->tp_allocs++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
169 if (tp->tp_allocs - tp->tp_frees > tp->tp_maxalloc) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
170 tp->tp_maxalloc = tp->tp_allocs - tp->tp_frees; |
|
1347
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
171 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
172 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
173 void dec_count(PyTypeObject *tp) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
174 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
175 tp->tp_frees++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
176 if (unlist_types_without_objects && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
177 tp->tp_allocs == tp->tp_frees) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
178 /* unlink the type from type_list */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
179 if (tp->tp_prev) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
180 tp->tp_prev->tp_next = tp->tp_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
181 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
182 type_list = tp->tp_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
183 if (tp->tp_next) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
184 tp->tp_next->tp_prev = tp->tp_prev; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
185 tp->tp_next = tp->tp_prev = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
186 Py_DECREF(tp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
187 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
188 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
189 |
|
1347
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
190 #endif |
|
a22a350d3a5d
* Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents:
1324
diff
changeset
|
191 |
|
24155
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
192 #ifdef Py_REF_DEBUG |
|
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
193 /* Log a fatal error; doesn't return. */ |
|
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
194 void |
|
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
195 _Py_NegativeRefcount(const char *fname, int lineno, PyObject *op) |
|
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
196 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
197 char buf[300]; |
|
24155
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
198 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
199 PyOS_snprintf(buf, sizeof(buf), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
200 "%s:%i object at %p has negative ref count " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
201 "%" PY_FORMAT_SIZE_T "d", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
202 fname, lineno, op, op->ob_refcnt); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
203 Py_FatalError(buf); |
|
24155
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
204 } |
|
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
205 |
|
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
206 #endif /* Py_REF_DEBUG */ |
|
9456a2ccda61
The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents:
24144
diff
changeset
|
207 |
|
31940
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
208 void |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
209 Py_IncRef(PyObject *o) |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
210 { |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
211 Py_XINCREF(o); |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
212 } |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
213 |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
214 void |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
215 Py_DecRef(PyObject *o) |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
216 { |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
217 Py_XDECREF(o); |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
218 } |
|
059740d52ae5
Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents:
31738
diff
changeset
|
219 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5006
diff
changeset
|
220 PyObject * |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
221 PyObject_Init(PyObject *op, PyTypeObject *tp) |
| 6 | 222 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
223 if (op == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
224 return PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
225 /* Any changes should be reflected in PyObject_INIT (objimpl.h) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
226 Py_TYPE(op) = tp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
227 _Py_NewReference(op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
228 return op; |
| 6 | 229 } |
| 230 | |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
231 PyVarObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
232 PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
233 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
234 if (op == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
235 return (PyVarObject *) PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
236 /* Any changes should be reflected in PyObject_INIT_VAR */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
237 op->ob_size = size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
238 Py_TYPE(op) = tp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
239 _Py_NewReference((PyObject *)op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
240 return op; |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
241 } |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
242 |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
243 PyObject * |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
244 _PyObject_New(PyTypeObject *tp) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
245 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
246 PyObject *op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
247 op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
248 if (op == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
249 return PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
250 return PyObject_INIT(op, tp); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
251 } |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
252 |
|
5535
20c2b715188e
Oops, another forgotten renaming: varobject -> PyVarObject.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
253 PyVarObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
254 _PyObject_NewVar(PyTypeObject *tp, Py_ssize_t nitems) |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
255 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
256 PyVarObject *op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
257 const size_t size = _PyObject_VAR_SIZE(tp, nitems); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
258 op = (PyVarObject *) PyObject_MALLOC(size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
259 if (op == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
260 return (PyVarObject *)PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
261 return PyObject_INIT_VAR(op, tp, nitems); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
262 } |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
263 |
|
84911
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
264 void |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
265 PyObject_CallFinalizer(PyObject *self) |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
266 { |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
267 PyTypeObject *tp = Py_TYPE(self); |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
268 |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
269 /* The former could happen on heaptypes created from the C API, e.g. |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
270 PyType_FromSpec(). */ |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
271 if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_FINALIZE) || |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
272 tp->tp_finalize == NULL) |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
273 return; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
274 /* tp_finalize should only be called once. */ |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
275 if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self)) |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
276 return; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
277 |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
278 tp->tp_finalize(self); |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
279 if (PyType_IS_GC(tp)) |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
280 _PyGC_SET_FINALIZED(self, 1); |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
281 } |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
282 |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
283 int |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
284 PyObject_CallFinalizerFromDealloc(PyObject *self) |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
285 { |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
286 Py_ssize_t refcnt; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
287 |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
288 /* Temporarily resurrect the object. */ |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
289 if (self->ob_refcnt != 0) { |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
290 Py_FatalError("PyObject_CallFinalizerFromDealloc called on " |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
291 "object with a non-zero refcount"); |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
292 } |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
293 self->ob_refcnt = 1; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
294 |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
295 PyObject_CallFinalizer(self); |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
296 |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
297 /* Undo the temporary resurrection; can't use DECREF here, it would |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
298 * cause a recursive call. |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
299 */ |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
300 assert(self->ob_refcnt > 0); |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
301 if (--self->ob_refcnt == 0) |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
302 return 0; /* this is the normal path out */ |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
303 |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
304 /* tp_finalize resurrected it! Make it look like the original Py_DECREF |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
305 * never happened. |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
306 */ |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
307 refcnt = self->ob_refcnt; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
308 _Py_NewReference(self); |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
309 self->ob_refcnt = refcnt; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
310 |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
311 if (PyType_IS_GC(Py_TYPE(self))) { |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
312 assert(_PyGC_REFS(self) != _PyGC_REFS_UNTRACKED); |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
313 } |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
314 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
315 * we need to undo that. */ |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
316 _Py_DEC_REFTOTAL; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
317 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
318 * chain, so no more to do there. |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
319 * If COUNT_ALLOCS, the original decref bumped tp_frees, and |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
320 * _Py_NewReference bumped tp_allocs: both of those need to be |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
321 * undone. |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
322 */ |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
323 #ifdef COUNT_ALLOCS |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
324 --Py_TYPE(self)->tp_frees; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
325 --Py_TYPE(self)->tp_allocs; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
326 #endif |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
327 return -1; |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
328 } |
|
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
329 |
|
63247
fd9b421cdbaf
Merged revisions 83184 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61656
diff
changeset
|
330 int |
|
fd9b421cdbaf
Merged revisions 83184 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61656
diff
changeset
|
331 PyObject_Print(PyObject *op, FILE *fp, int flags) |
| 6 | 332 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
333 int ret = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
334 if (PyErr_CheckSignals()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
335 return -1; |
|
8181
c69ad566aeb1
If USE_STACKCHECK is defined use PyOS_CheckStack() in the repr and str
Guido van Rossum <guido@python.org>
parents:
8111
diff
changeset
|
336 #ifdef USE_STACKCHECK |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
337 if (PyOS_CheckStack()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
338 PyErr_SetString(PyExc_MemoryError, "stack overflow"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
339 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
340 } |
|
8181
c69ad566aeb1
If USE_STACKCHECK is defined use PyOS_CheckStack() in the repr and str
Guido van Rossum <guido@python.org>
parents:
8111
diff
changeset
|
341 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
342 clearerr(fp); /* Clear any previous error condition */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
343 if (op == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
344 Py_BEGIN_ALLOW_THREADS |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
345 fprintf(fp, "<nil>"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
346 Py_END_ALLOW_THREADS |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
347 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
348 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
349 if (op->ob_refcnt <= 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
350 /* XXX(twouters) cast refcount to long until %zd is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
351 universally available */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
352 Py_BEGIN_ALLOW_THREADS |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
353 fprintf(fp, "<refcnt %ld at %p>", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
354 (long)op->ob_refcnt, op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
355 Py_END_ALLOW_THREADS |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
356 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
357 PyObject *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
358 if (flags & Py_PRINT_RAW) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
359 s = PyObject_Str(op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
360 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
361 s = PyObject_Repr(op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
362 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
363 ret = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
364 else if (PyBytes_Check(s)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
365 fwrite(PyBytes_AS_STRING(s), 1, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
366 PyBytes_GET_SIZE(s), fp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
367 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
368 else if (PyUnicode_Check(s)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
369 PyObject *t; |
| 72475 | 370 t = PyUnicode_AsEncodedString(s, "utf-8", "backslashreplace"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
371 if (t == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
372 ret = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
373 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
374 fwrite(PyBytes_AS_STRING(t), 1, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
375 PyBytes_GET_SIZE(t), fp); |
|
61656
ca81646dd29c
Merged revisions 81250-81253 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
376 Py_DECREF(t); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
377 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
378 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
379 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
380 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
381 "str() or repr() returned '%.100s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
382 s->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
383 ret = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
384 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
385 Py_XDECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
386 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
387 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
388 if (ret == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
389 if (ferror(fp)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
390 PyErr_SetFromErrno(PyExc_IOError); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
391 clearerr(fp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
392 ret = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
393 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
394 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
395 return ret; |
| 6 | 396 } |
| 397 | |
|
39623
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
398 /* For debugging convenience. Set a breakpoint here and call it from your DLL */ |
|
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
399 void |
|
40737
6ebad2a6b990
Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
40485
diff
changeset
|
400 _Py_BreakPoint(void) |
|
39623
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
401 { |
|
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
402 } |
|
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
403 |
|
27234
e9f45b8efd6b
Fix SF bug #667147, Segmentation fault printing str subclass
Neal Norwitz <nnorwitz@gmail.com>
parents:
26263
diff
changeset
|
404 |
|
16165
0a72070eab6e
A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents:
16123
diff
changeset
|
405 /* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */ |
|
39623
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
406 void |
|
c6d9fa81f20f
Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
407 _PyObject_Dump(PyObject* op) |
|
16165
0a72070eab6e
A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents:
16123
diff
changeset
|
408 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
409 if (op == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
410 fprintf(stderr, "NULL\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
411 else { |
|
52870
98f42392835b
Merge revision 71222 from trunk: #5615: make it possible to configure --without-threads again.
Georg Brandl <georg@python.org>
parents:
51776
diff
changeset
|
412 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
413 PyGILState_STATE gil; |
|
52870
98f42392835b
Merge revision 71222 from trunk: #5615: make it possible to configure --without-threads again.
Georg Brandl <georg@python.org>
parents:
51776
diff
changeset
|
414 #endif |
|
85414
79ce25c70795
Issue #18408: _PyObject_Dump() now saves/restores the current exception
Victor Stinner <vstinner@wyplay.com>
parents:
85366
diff
changeset
|
415 PyObject *error_type, *error_value, *error_traceback; |
|
79ce25c70795
Issue #18408: _PyObject_Dump() now saves/restores the current exception
Victor Stinner <vstinner@wyplay.com>
parents:
85366
diff
changeset
|
416 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
417 fprintf(stderr, "object : "); |
|
52870
98f42392835b
Merge revision 71222 from trunk: #5615: make it possible to configure --without-threads again.
Georg Brandl <georg@python.org>
parents:
51776
diff
changeset
|
418 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
419 gil = PyGILState_Ensure(); |
|
52870
98f42392835b
Merge revision 71222 from trunk: #5615: make it possible to configure --without-threads again.
Georg Brandl <georg@python.org>
parents:
51776
diff
changeset
|
420 #endif |
|
85414
79ce25c70795
Issue #18408: _PyObject_Dump() now saves/restores the current exception
Victor Stinner <vstinner@wyplay.com>
parents:
85366
diff
changeset
|
421 |
|
79ce25c70795
Issue #18408: _PyObject_Dump() now saves/restores the current exception
Victor Stinner <vstinner@wyplay.com>
parents:
85366
diff
changeset
|
422 PyErr_Fetch(&error_type, &error_value, &error_traceback); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
423 (void)PyObject_Print(op, stderr, 0); |
|
85414
79ce25c70795
Issue #18408: _PyObject_Dump() now saves/restores the current exception
Victor Stinner <vstinner@wyplay.com>
parents:
85366
diff
changeset
|
424 PyErr_Restore(error_type, error_value, error_traceback); |
|
79ce25c70795
Issue #18408: _PyObject_Dump() now saves/restores the current exception
Victor Stinner <vstinner@wyplay.com>
parents:
85366
diff
changeset
|
425 |
|
52870
98f42392835b
Merge revision 71222 from trunk: #5615: make it possible to configure --without-threads again.
Georg Brandl <georg@python.org>
parents:
51776
diff
changeset
|
426 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
427 PyGILState_Release(gil); |
|
52870
98f42392835b
Merge revision 71222 from trunk: #5615: make it possible to configure --without-threads again.
Georg Brandl <georg@python.org>
parents:
51776
diff
changeset
|
428 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
429 /* XXX(twouters) cast refcount to long until %zd is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
430 universally available */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
431 fprintf(stderr, "\n" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
432 "type : %s\n" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
433 "refcount: %ld\n" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
434 "address : %p\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
435 Py_TYPE(op)==NULL ? "NULL" : Py_TYPE(op)->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
436 (long)op->ob_refcnt, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
437 op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
438 } |
|
16165
0a72070eab6e
A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents:
16123
diff
changeset
|
439 } |
|
16167
71ceaba3f615
PyObject_Dump(): Use %p format to print the address of the pointer.
Barry Warsaw <barry@python.org>
parents:
16165
diff
changeset
|
440 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5006
diff
changeset
|
441 PyObject * |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
442 PyObject_Repr(PyObject *v) |
| 6 | 443 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
444 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
445 if (PyErr_CheckSignals()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
446 return NULL; |
|
8181
c69ad566aeb1
If USE_STACKCHECK is defined use PyOS_CheckStack() in the repr and str
Guido van Rossum <guido@python.org>
parents:
8111
diff
changeset
|
447 #ifdef USE_STACKCHECK |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
448 if (PyOS_CheckStack()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
449 PyErr_SetString(PyExc_MemoryError, "stack overflow"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
450 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
451 } |
|
8181
c69ad566aeb1
If USE_STACKCHECK is defined use PyOS_CheckStack() in the repr and str
Guido van Rossum <guido@python.org>
parents:
8111
diff
changeset
|
452 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
453 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
454 return PyUnicode_FromString("<NULL>"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
455 if (Py_TYPE(v)->tp_repr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
456 return PyUnicode_FromFormat("<%s object at %p>", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
457 v->ob_type->tp_name, v); |
|
85416
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
458 |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
459 #ifdef Py_DEBUG |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
460 /* PyObject_Repr() must not be called with an exception set, |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
461 because it may clear it (directly or indirectly) and so the |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
462 caller looses its exception */ |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
463 assert(!PyErr_Occurred()); |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
464 #endif |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
465 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
466 res = (*v->ob_type->tp_repr)(v); |
|
73804
0d1536ec44e8
Fix PyObject_Repr(): don't call PyUnicode_READY() if res is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73799
diff
changeset
|
467 if (res == NULL) |
|
0d1536ec44e8
Fix PyObject_Repr(): don't call PyUnicode_READY() if res is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73799
diff
changeset
|
468 return NULL; |
|
0d1536ec44e8
Fix PyObject_Repr(): don't call PyUnicode_READY() if res is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73799
diff
changeset
|
469 if (!PyUnicode_Check(res)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
470 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
471 "__repr__ returned non-string (type %.200s)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
472 res->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
473 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
474 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
475 } |
|
73799
c5d2ce38b0d3
PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73669
diff
changeset
|
476 #ifndef Py_DEBUG |
|
c5d2ce38b0d3
PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73669
diff
changeset
|
477 if (PyUnicode_READY(res) < 0) |
|
c5d2ce38b0d3
PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73669
diff
changeset
|
478 return NULL; |
|
c5d2ce38b0d3
PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73669
diff
changeset
|
479 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
480 return res; |
| 6 | 481 } |
| 482 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5006
diff
changeset
|
483 PyObject * |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
484 PyObject_Str(PyObject *v) |
|
1400
aac8231a715c
* mpzmodule.c: removed redundant mpz_print function.
Guido van Rossum <guido@python.org>
parents:
1361
diff
changeset
|
485 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
486 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
487 if (PyErr_CheckSignals()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
488 return NULL; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
489 #ifdef USE_STACKCHECK |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
490 if (PyOS_CheckStack()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
491 PyErr_SetString(PyExc_MemoryError, "stack overflow"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
492 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
493 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
494 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
495 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
496 return PyUnicode_FromString("<NULL>"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
497 if (PyUnicode_CheckExact(v)) { |
|
73799
c5d2ce38b0d3
PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73669
diff
changeset
|
498 #ifndef Py_DEBUG |
|
73643
701165dfaae5
PyObject_Str() ensures that the result string is ready
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73457
diff
changeset
|
499 if (PyUnicode_READY(v) < 0) |
|
701165dfaae5
PyObject_Str() ensures that the result string is ready
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73457
diff
changeset
|
500 return NULL; |
|
73799
c5d2ce38b0d3
PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73669
diff
changeset
|
501 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
502 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
503 return v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
504 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
505 if (Py_TYPE(v)->tp_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
506 return PyObject_Repr(v); |
|
17646
d1ec679baa3d
Printing objects to a real file still wasn't done right: if the
Guido van Rossum <guido@python.org>
parents:
17639
diff
changeset
|
507 |
|
85416
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
508 #ifdef Py_DEBUG |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
509 /* PyObject_Str() must not be called with an exception set, |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
510 because it may clear it (directly or indirectly) and so the |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
511 caller looses its exception */ |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
512 assert(!PyErr_Occurred()); |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
513 #endif |
|
8fb3a6f9b0a4
Restore changeset 5bd9db528aed (issue #18408)
Victor Stinner <vstinner@wyplay.com>
parents:
85414
diff
changeset
|
514 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
515 /* It is possible for a type to have a tp_str representation that loops |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
516 infinitely. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
517 if (Py_EnterRecursiveCall(" while getting the str of an object")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
518 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
519 res = (*Py_TYPE(v)->tp_str)(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
520 Py_LeaveRecursiveCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
521 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
522 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
523 if (!PyUnicode_Check(res)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
524 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
525 "__str__ returned non-string (type %.200s)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
526 Py_TYPE(res)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
527 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
528 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
529 } |
|
73799
c5d2ce38b0d3
PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73669
diff
changeset
|
530 #ifndef Py_DEBUG |
|
73643
701165dfaae5
PyObject_Str() ensures that the result string is ready
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73457
diff
changeset
|
531 if (PyUnicode_READY(res) < 0) |
|
701165dfaae5
PyObject_Str() ensures that the result string is ready
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73457
diff
changeset
|
532 return NULL; |
|
73799
c5d2ce38b0d3
PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73669
diff
changeset
|
533 #endif |
|
73643
701165dfaae5
PyObject_Str() ensures that the result string is ready
Victor Stinner <victor.stinner@haypocalc.com>
parents:
73457
diff
changeset
|
534 assert(_PyUnicode_CheckConsistency(res, 1)); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
535 return res; |
|
35331
ef11cbc08dab
Change the %s format specifier for str objects so that it returns a
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
34931
diff
changeset
|
536 } |
|
ef11cbc08dab
Change the %s format specifier for str objects so that it returns a
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
34931
diff
changeset
|
537 |
|
47611
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47301
diff
changeset
|
538 PyObject * |
|
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47301
diff
changeset
|
539 PyObject_ASCII(PyObject *v) |
|
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47301
diff
changeset
|
540 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
541 PyObject *repr, *ascii, *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
542 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
543 repr = PyObject_Repr(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
544 if (repr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
545 return NULL; |
|
47611
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47301
diff
changeset
|
546 |
|
83383
ff89957e3204
Optimize ascii(str): don't encode/decode repr if repr is already ASCII
Victor Stinner <victor.stinner@gmail.com>
parents:
80076
diff
changeset
|
547 if (PyUnicode_IS_ASCII(repr)) |
|
ff89957e3204
Optimize ascii(str): don't encode/decode repr if repr is already ASCII
Victor Stinner <victor.stinner@gmail.com>
parents:
80076
diff
changeset
|
548 return repr; |
|
ff89957e3204
Optimize ascii(str): don't encode/decode repr if repr is already ASCII
Victor Stinner <victor.stinner@gmail.com>
parents:
80076
diff
changeset
|
549 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
550 /* repr is guaranteed to be a PyUnicode object by PyObject_Repr */ |
| 72475 | 551 ascii = _PyUnicode_AsASCIIString(repr, "backslashreplace"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
552 Py_DECREF(repr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
553 if (ascii == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
554 return NULL; |
|
47611
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47301
diff
changeset
|
555 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
556 res = PyUnicode_DecodeASCII( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
557 PyBytes_AS_STRING(ascii), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
558 PyBytes_GET_SIZE(ascii), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
559 NULL); |
|
47611
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47301
diff
changeset
|
560 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
561 Py_DECREF(ascii); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
562 return res; |
|
47611
da47e7e135ae
#2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents:
47301
diff
changeset
|
563 } |
|
16001
f3740674ac5b
Changes to recursive-object comparisons, having to do with a test case
Guido van Rossum <guido@python.org>
parents:
15962
diff
changeset
|
564 |
|
48871
548dccc4008e
make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
565 PyObject * |
|
548dccc4008e
make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
566 PyObject_Bytes(PyObject *v) |
|
548dccc4008e
make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
567 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
568 PyObject *result, *func; |
|
48871
548dccc4008e
make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
569 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
570 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
571 return PyBytes_FromString("<NULL>"); |
|
48871
548dccc4008e
make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
572 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
573 if (PyBytes_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
574 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
575 return v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
576 } |
|
48871
548dccc4008e
make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
577 |
|
74578
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
74416
diff
changeset
|
578 func = _PyObject_LookupSpecial(v, &PyId___bytes__); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
579 if (func != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
580 result = PyObject_CallFunctionObjArgs(func, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
581 Py_DECREF(func); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
582 if (result == NULL) |
|
64654
17a8f704f07d
Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64299
diff
changeset
|
583 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
584 if (!PyBytes_Check(result)) { |
|
64654
17a8f704f07d
Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64299
diff
changeset
|
585 PyErr_Format(PyExc_TypeError, |
|
17a8f704f07d
Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64299
diff
changeset
|
586 "__bytes__ returned non-bytes (type %.200s)", |
|
17a8f704f07d
Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64299
diff
changeset
|
587 Py_TYPE(result)->tp_name); |
|
17a8f704f07d
Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64299
diff
changeset
|
588 Py_DECREF(result); |
|
17a8f704f07d
Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
64299
diff
changeset
|
589 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
590 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
591 return result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
592 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
593 else if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
594 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
595 return PyBytes_FromObject(v); |
|
48871
548dccc4008e
make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
596 } |
|
548dccc4008e
make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
597 |
|
51247
ba94d7c095e8
Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents:
51245
diff
changeset
|
598 /* For Python 3.0.1 and later, the old three-way comparison has been |
|
ba94d7c095e8
Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents:
51245
diff
changeset
|
599 completely removed in favour of rich comparisons. PyObject_Compare() and |
|
ba94d7c095e8
Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents:
51245
diff
changeset
|
600 PyObject_Cmp() are gone, and the builtin cmp function no longer exists. |
|
51270
debd14c489b9
Issue #1717: rename tp_compare to tp_reserved. I'll change the
Mark Dickinson <dickinsm@gmail.com>
parents:
51247
diff
changeset
|
601 The old tp_compare slot has been renamed to tp_reserved, and should no |
|
51247
ba94d7c095e8
Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents:
51245
diff
changeset
|
602 longer be used. Use tp_richcompare instead. |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
603 |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
604 See (*) below for practical amendments. |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
605 |
|
51247
ba94d7c095e8
Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents:
51245
diff
changeset
|
606 tp_richcompare gets called with a first argument of the appropriate type |
|
ba94d7c095e8
Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents:
51245
diff
changeset
|
607 and a second object of an arbitrary type. We never do any kind of |
|
ba94d7c095e8
Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents:
51245
diff
changeset
|
608 coercion. |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
609 |
|
51247
ba94d7c095e8
Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents:
51245
diff
changeset
|
610 The tp_richcompare slot should return an object, as follows: |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
611 |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
612 NULL if an exception occurred |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
613 NotImplemented if the requested comparison is not implemented |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
614 any other false value if the requested comparison is false |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
615 any other true value if the requested comparison is true |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
616 |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
617 The PyObject_RichCompare[Bool]() wrappers raise TypeError when they get |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
618 NotImplemented. |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
619 |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
620 (*) Practical amendments: |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
621 |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
622 - If rich comparison returns NotImplemented, == and != are decided by |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
623 comparing the object pointer (i.e. falling back to the base object |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
624 implementation). |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
625 |
|
23598
2b1d61781d63
Implement the intention of SF patch 472523 (but coded differently).
Guido van Rossum <guido@python.org>
parents:
23542
diff
changeset
|
626 */ |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
627 |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
628 /* Map rich comparison operators to their swapped version, e.g. LT <--> GT */ |
|
33571
a5682bc73e04
Remove 'extern' declaration for _Py_SwappedOp.
Brett Cannon <bcannon@gmail.com>
parents:
33541
diff
changeset
|
629 int _Py_SwappedOp[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE}; |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
630 |
|
40485
d4fcb5656316
The opstrings table was backwards. Add an XXX comment.
Guido van Rossum <guido@python.org>
parents:
40401
diff
changeset
|
631 static char *opstrings[] = {"<", "<=", "==", "!=", ">", ">="}; |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
632 |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
633 /* Perform a rich comparison, raising TypeError when the requested comparison |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
634 operator is not supported. */ |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
635 static PyObject * |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
636 do_richcompare(PyObject *v, PyObject *w, int op) |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
637 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
638 richcmpfunc f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
639 PyObject *res; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60381
diff
changeset
|
640 int checked_reverse_op = 0; |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
641 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
642 if (v->ob_type != w->ob_type && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
643 PyType_IsSubtype(w->ob_type, v->ob_type) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
644 (f = w->ob_type->tp_richcompare) != NULL) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60381
diff
changeset
|
645 checked_reverse_op = 1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
646 res = (*f)(w, v, _Py_SwappedOp[op]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
647 if (res != Py_NotImplemented) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
648 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
649 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
650 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
651 if ((f = v->ob_type->tp_richcompare) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
652 res = (*f)(v, w, op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
653 if (res != Py_NotImplemented) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
654 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
655 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
656 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60381
diff
changeset
|
657 if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
658 res = (*f)(w, v, _Py_SwappedOp[op]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
659 if (res != Py_NotImplemented) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
660 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
661 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
662 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
663 /* If neither object implements it, provide a sensible default |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
664 for == and !=, but raise an exception for ordering. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
665 switch (op) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
666 case Py_EQ: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
667 res = (v == w) ? Py_True : Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
668 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
669 case Py_NE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
670 res = (v != w) ? Py_True : Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
671 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
672 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
673 /* XXX Special-case None so it doesn't show as NoneType() */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
674 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
675 "unorderable types: %.100s() %s %.100s()", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
676 v->ob_type->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
677 opstrings[op], |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
678 w->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
679 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
680 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
681 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
682 return res; |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
683 } |
|
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
684 |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
685 /* Perform a rich comparison with object result. This wraps do_richcompare() |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
686 with a check for NULL arguments and a recursion check. */ |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
687 |
|
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
688 PyObject * |
|
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
689 PyObject_RichCompare(PyObject *v, PyObject *w, int op) |
|
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
690 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
691 PyObject *res; |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
692 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
693 assert(Py_LT <= op && op <= Py_GE); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
694 if (v == NULL || w == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
695 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
696 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
697 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
698 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
699 if (Py_EnterRecursiveCall(" in comparison")) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
700 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
701 res = do_richcompare(v, w, op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
702 Py_LeaveRecursiveCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
703 return res; |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
704 } |
|
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
705 |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
706 /* Perform a rich comparison with integer result. This wraps |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
707 PyObject_RichCompare(), returning -1 for error, 0 for false, 1 for true. */ |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
708 int |
|
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
709 PyObject_RichCompareBool(PyObject *v, PyObject *w, int op) |
|
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
710 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
711 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
712 int ok; |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
713 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
714 /* Quick result when objects are the same. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
715 Guarantees that identity implies equality. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
716 if (v == w) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
717 if (op == Py_EQ) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
718 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
719 else if (op == Py_NE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
720 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
721 } |
|
49721
98628dc730da
Issue #4296: Fix PyObject_RichCompareBool so that "x in [x]" evaluates to
Mark Dickinson <dickinsm@gmail.com>
parents:
48885
diff
changeset
|
722 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
723 res = PyObject_RichCompare(v, w, op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
724 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
725 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
726 if (PyBool_Check(res)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
727 ok = (res == Py_True); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
728 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
729 ok = PyObject_IsTrue(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
730 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
731 return ok; |
|
15941
5abae795742e
Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents:
15726
diff
changeset
|
732 } |
|
13141
cca84745da3e
This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents:
13089
diff
changeset
|
733 |
|
73669
215690b782f8
Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73643
diff
changeset
|
734 Py_hash_t |
|
48475
f4e7ef4329a9
Manual forward port of 64962 - use PyObject_HashNotImplemented as a tp_hash level indicator that the default hash implementation has not been inherited
Nick Coghlan <ncoghlan@gmail.com>
parents:
47611
diff
changeset
|
735 PyObject_HashNotImplemented(PyObject *v) |
|
f4e7ef4329a9
Manual forward port of 64962 - use PyObject_HashNotImplemented as a tp_hash level indicator that the default hash implementation has not been inherited
Nick Coghlan <ncoghlan@gmail.com>
parents:
47611
diff
changeset
|
736 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
737 PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
738 Py_TYPE(v)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
739 return -1; |
|
48475
f4e7ef4329a9
Manual forward port of 64962 - use PyObject_HashNotImplemented as a tp_hash level indicator that the default hash implementation has not been inherited
Nick Coghlan <ncoghlan@gmail.com>
parents:
47611
diff
changeset
|
740 } |
|
13141
cca84745da3e
This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents:
13089
diff
changeset
|
741 |
|
65494
e8969fb822fc
make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents:
65348
diff
changeset
|
742 Py_hash_t |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
743 PyObject_Hash(PyObject *v) |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1051
diff
changeset
|
744 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
745 PyTypeObject *tp = Py_TYPE(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
746 if (tp->tp_hash != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
747 return (*tp->tp_hash)(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
748 /* To keep to the general practice that inheriting |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
749 * solely from object in C code should work without |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
750 * an explicit call to PyType_Ready, we implicitly call |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
751 * PyType_Ready here and then check the tp_hash slot again |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
752 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
753 if (tp->tp_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
754 if (PyType_Ready(tp) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
755 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
756 if (tp->tp_hash != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
757 return (*tp->tp_hash)(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
758 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
759 /* Otherwise, the object can't be hashed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
760 return PyObject_HashNotImplemented(v); |
|
1257
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1051
diff
changeset
|
761 } |
|
1cabc2b6c970
* Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents:
1051
diff
changeset
|
762 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5006
diff
changeset
|
763 PyObject * |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35331
diff
changeset
|
764 PyObject_GetAttrString(PyObject *v, const char *name) |
| 86 | 765 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
766 PyObject *w, *res; |
|
3986
9c2cbf306864
Support for tp_getattro, tp_setattro (Sjoerd)
Guido van Rossum <guido@python.org>
parents:
3770
diff
changeset
|
767 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
768 if (Py_TYPE(v)->tp_getattr != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
769 return (*Py_TYPE(v)->tp_getattr)(v, (char*)name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
770 w = PyUnicode_InternFromString(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
771 if (w == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
772 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
773 res = PyObject_GetAttr(v, w); |
|
75866
059489cec7b9
Micro-optimize PyObject_GetAttrString()
Victor Stinner <victor.stinner@gmail.com>
parents:
75508
diff
changeset
|
774 Py_DECREF(w); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
775 return res; |
| 86 | 776 } |
| 777 | |
| 778 int | |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35331
diff
changeset
|
779 PyObject_HasAttrString(PyObject *v, const char *name) |
|
1324
716be765a79b
* accessobject.c (ownercheck): allow a base class access to protected
Guido van Rossum <guido@python.org>
parents:
1282
diff
changeset
|
780 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
781 PyObject *res = PyObject_GetAttrString(v, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
782 if (res != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
783 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
784 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
785 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
786 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
787 return 0; |
|
1324
716be765a79b
* accessobject.c (ownercheck): allow a base class access to protected
Guido van Rossum <guido@python.org>
parents:
1282
diff
changeset
|
788 } |
|
716be765a79b
* accessobject.c (ownercheck): allow a base class access to protected
Guido van Rossum <guido@python.org>
parents:
1282
diff
changeset
|
789 |
|
716be765a79b
* accessobject.c (ownercheck): allow a base class access to protected
Guido van Rossum <guido@python.org>
parents:
1282
diff
changeset
|
790 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35331
diff
changeset
|
791 PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w) |
| 86 | 792 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
793 PyObject *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
794 int res; |
|
3986
9c2cbf306864
Support for tp_getattro, tp_setattro (Sjoerd)
Guido van Rossum <guido@python.org>
parents:
3770
diff
changeset
|
795 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
796 if (Py_TYPE(v)->tp_setattr != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
797 return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
798 s = PyUnicode_InternFromString(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
799 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
800 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
801 res = PyObject_SetAttr(v, s, w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
802 Py_XDECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
803 return res; |
| 86 | 804 } |
| 805 | |
|
73984
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
806 int |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
807 _PyObject_IsAbstract(PyObject *obj) |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
808 { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
809 int res; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
810 PyObject* isabstract; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
811 |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
812 if (obj == NULL) |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
813 return 0; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
814 |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
815 isabstract = _PyObject_GetAttrId(obj, &PyId___isabstractmethod__); |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
816 if (isabstract == NULL) { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
817 if (PyErr_ExceptionMatches(PyExc_AttributeError)) { |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
818 PyErr_Clear(); |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
819 return 0; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
820 } |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
821 return -1; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
822 } |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
823 res = PyObject_IsTrue(isabstract); |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
824 Py_DECREF(isabstract); |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
825 return res; |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
826 } |
|
e979b26a9172
improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents:
73804
diff
changeset
|
827 |
|
5560
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
828 PyObject * |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
829 _PyObject_GetAttrId(PyObject *v, _Py_Identifier *name) |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
830 { |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
831 PyObject *result; |
|
73457
6ae8c68eb0c1
Make _PyUnicode_FromId return borrowed references.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
832 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
833 if (!oname) |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
834 return NULL; |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
835 result = PyObject_GetAttr(v, oname); |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
836 return result; |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
837 } |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
838 |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
839 int |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
840 _PyObject_HasAttrId(PyObject *v, _Py_Identifier *name) |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
841 { |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
842 int result; |
|
73457
6ae8c68eb0c1
Make _PyUnicode_FromId return borrowed references.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
843 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
844 if (!oname) |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
845 return -1; |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
846 result = PyObject_HasAttr(v, oname); |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
847 return result; |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
848 } |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
849 |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
850 int |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
851 _PyObject_SetAttrId(PyObject *v, _Py_Identifier *name, PyObject *w) |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
852 { |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
853 int result; |
|
73457
6ae8c68eb0c1
Make _PyUnicode_FromId return borrowed references.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
854 PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
855 if (!oname) |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
856 return -1; |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
857 result = PyObject_SetAttr(v, oname, w); |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
858 return result; |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
859 } |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
860 |
|
5560
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
861 PyObject * |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
862 PyObject_GetAttr(PyObject *v, PyObject *name) |
|
5560
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
863 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
864 PyTypeObject *tp = Py_TYPE(v); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
865 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
866 if (!PyUnicode_Check(name)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
867 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
868 "attribute name must be string, not '%.200s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
869 name->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
870 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
871 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
872 if (tp->tp_getattro != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
873 return (*tp->tp_getattro)(v, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
874 if (tp->tp_getattr != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
875 char *name_str = _PyUnicode_AsString(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
876 if (name_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
877 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
878 return (*tp->tp_getattr)(v, name_str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
879 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
880 PyErr_Format(PyExc_AttributeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
881 "'%.50s' object has no attribute '%U'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
882 tp->tp_name, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
883 return NULL; |
|
5560
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
884 } |
|
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
885 |
|
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
886 int |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
887 PyObject_HasAttr(PyObject *v, PyObject *name) |
|
5560
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
888 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
889 PyObject *res = PyObject_GetAttr(v, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
890 if (res != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
891 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
892 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
893 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
894 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
895 return 0; |
|
5560
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
896 } |
|
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
897 |
|
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
898 int |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
899 PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) |
|
5560
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
900 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
901 PyTypeObject *tp = Py_TYPE(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
902 int err; |
|
14660
983502b2cd43
PyObject_SetAttr() and PyObject_GetAttr() now also accept Unicode
Marc-André Lemburg <mal@egenix.com>
parents:
14375
diff
changeset
|
903 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
904 if (!PyUnicode_Check(name)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
905 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
906 "attribute name must be string, not '%.200s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
907 name->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
908 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
909 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
910 Py_INCREF(name); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
911 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
912 PyUnicode_InternInPlace(&name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
913 if (tp->tp_setattro != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
914 err = (*tp->tp_setattro)(v, name, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
915 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
916 return err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
917 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
918 if (tp->tp_setattr != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
919 char *name_str = _PyUnicode_AsString(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
920 if (name_str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
921 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
922 err = (*tp->tp_setattr)(v, name_str, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
923 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
924 return err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
925 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
926 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
927 assert(name->ob_refcnt >= 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
928 if (tp->tp_getattr == NULL && tp->tp_getattro == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
929 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
930 "'%.100s' object has no attributes " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
931 "(%s .%U)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
932 tp->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
933 value==NULL ? "del" : "assign to", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
934 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
935 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
936 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
937 "'%.100s' object has only read-only attributes " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
938 "(%s .%U)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
939 tp->tp_name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
940 value==NULL ? "del" : "assign to", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
941 name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
942 return -1; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
943 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
944 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
945 /* Helper to get a pointer to an object's __dict__ slot, if any */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
946 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
947 PyObject ** |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
948 _PyObject_GetDictPtr(PyObject *obj) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
949 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
950 Py_ssize_t dictoffset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
951 PyTypeObject *tp = Py_TYPE(obj); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
952 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
953 dictoffset = tp->tp_dictoffset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
954 if (dictoffset == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
955 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
956 if (dictoffset < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
957 Py_ssize_t tsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
958 size_t size; |
|
22106
93eb4b61f687
SF patch 514641 (Naofumi Honda) - Negative ob_size of LongObjects
Guido van Rossum <guido@python.org>
parents:
21186
diff
changeset
|
959 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
960 tsize = ((PyVarObject *)obj)->ob_size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
961 if (tsize < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
962 tsize = -tsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
963 size = _PyObject_VAR_SIZE(tp, tsize); |
|
22106
93eb4b61f687
SF patch 514641 (Naofumi Honda) - Negative ob_size of LongObjects
Guido van Rossum <guido@python.org>
parents:
21186
diff
changeset
|
964 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
965 dictoffset += (long)size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
966 assert(dictoffset > 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
967 assert(dictoffset % SIZEOF_VOID_P == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
968 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
969 return (PyObject **) ((char *)obj + dictoffset); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
970 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
971 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
972 PyObject * |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
973 PyObject_SelfIter(PyObject *obj) |
|
28308
9c3572a5575f
Created PyObject_GenericGetIter().
Raymond Hettinger <python@rcn.com>
parents:
27966
diff
changeset
|
974 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
975 Py_INCREF(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
976 return obj; |
|
28308
9c3572a5575f
Created PyObject_GenericGetIter().
Raymond Hettinger <python@rcn.com>
parents:
27966
diff
changeset
|
977 } |
|
9c3572a5575f
Created PyObject_GenericGetIter().
Raymond Hettinger <python@rcn.com>
parents:
27966
diff
changeset
|
978 |
|
76105
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
979 /* Convenience function to get a builtin from its name */ |
|
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
980 PyObject * |
|
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
981 _PyObject_GetBuiltin(const char *name) |
|
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
982 { |
|
86981
3f9f2cfae53b
Issue #19512: Use the new _PyId_builtins identifier
Victor Stinner <victor.stinner@gmail.com>
parents:
86967
diff
changeset
|
983 PyObject *mod_name, *mod, *attr; |
|
3f9f2cfae53b
Issue #19512: Use the new _PyId_builtins identifier
Victor Stinner <victor.stinner@gmail.com>
parents:
86967
diff
changeset
|
984 |
|
86999
01c4a0af73cf
Issue #19512, #19515: remove shared identifiers, move identifiers where they
Victor Stinner <victor.stinner@gmail.com>
parents:
86981
diff
changeset
|
985 mod_name = _PyUnicode_FromId(&PyId_builtins); /* borrowed */ |
|
86981
3f9f2cfae53b
Issue #19512: Use the new _PyId_builtins identifier
Victor Stinner <victor.stinner@gmail.com>
parents:
86967
diff
changeset
|
986 if (mod_name == NULL) |
|
3f9f2cfae53b
Issue #19512: Use the new _PyId_builtins identifier
Victor Stinner <victor.stinner@gmail.com>
parents:
86967
diff
changeset
|
987 return NULL; |
|
3f9f2cfae53b
Issue #19512: Use the new _PyId_builtins identifier
Victor Stinner <victor.stinner@gmail.com>
parents:
86967
diff
changeset
|
988 mod = PyImport_Import(mod_name); |
|
76105
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
989 if (mod == NULL) |
|
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
990 return NULL; |
|
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
991 attr = PyObject_GetAttrString(mod, name); |
|
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
992 Py_DECREF(mod); |
|
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
993 return attr; |
|
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
994 } |
|
fb907ee4fdfa
Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75866
diff
changeset
|
995 |
|
50755
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
996 /* Helper used when the __next__ method is removed from a type: |
|
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
997 tp_iternext is never NULL and can be safely called without checking |
|
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
998 on every iteration. |
|
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
999 */ |
|
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
1000 |
|
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
1001 PyObject * |
|
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
1002 _PyObject_NextNotImplemented(PyObject *self) |
|
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
1003 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1004 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1005 "'%.200s' object is not iterable", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1006 Py_TYPE(self)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1007 return NULL; |
|
50755
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
1008 } |
|
c99ce0164699
Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
50735
diff
changeset
|
1009 |
|
33489
4cb1016525b7
Move a comment back to its rightful location.
Michael W. Hudson <mwh@python.net>
parents:
32981
diff
changeset
|
1010 /* Generic GetAttr functions - put these in your tp_[gs]etattro slot */ |
|
4cb1016525b7
Move a comment back to its rightful location.
Michael W. Hudson <mwh@python.net>
parents:
32981
diff
changeset
|
1011 |
|
28308
9c3572a5575f
Created PyObject_GenericGetIter().
Raymond Hettinger <python@rcn.com>
parents:
27966
diff
changeset
|
1012 PyObject * |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1013 _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, PyObject *dict) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1014 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1015 PyTypeObject *tp = Py_TYPE(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1016 PyObject *descr = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1017 PyObject *res = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1018 descrgetfunc f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1019 Py_ssize_t dictoffset; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1020 PyObject **dictptr; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1021 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1022 if (!PyUnicode_Check(name)){ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1023 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1024 "attribute name must be string, not '%.200s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1025 name->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1026 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1027 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1028 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1029 Py_INCREF(name); |
|
21186
0189186f4ed9
PyObject_Generic{Get,Set}Attr(): ensure that the attribute name is a
Guido van Rossum <guido@python.org>
parents:
20865
diff
changeset
|
1030 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1031 if (tp->tp_dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1032 if (PyType_Ready(tp) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1033 goto done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1034 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1035 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1036 descr = _PyType_Lookup(tp, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1037 Py_XINCREF(descr); |
| 30159 | 1038 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1039 f = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1040 if (descr != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1041 f = descr->ob_type->tp_descr_get; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1042 if (f != NULL && PyDescr_IsData(descr)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1043 res = f(descr, obj, (PyObject *)obj->ob_type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1044 goto done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1045 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1046 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1047 |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1048 if (dict == NULL) { |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1049 /* Inline _PyObject_GetDictPtr */ |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1050 dictoffset = tp->tp_dictoffset; |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1051 if (dictoffset != 0) { |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1052 if (dictoffset < 0) { |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1053 Py_ssize_t tsize; |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1054 size_t size; |
|
24894
8862bc59685a
Inline call to _PyObject_GetDictPtr() in PyObject_GenericGetAttr().
Guido van Rossum <guido@python.org>
parents:
24644
diff
changeset
|
1055 |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1056 tsize = ((PyVarObject *)obj)->ob_size; |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1057 if (tsize < 0) |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1058 tsize = -tsize; |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1059 size = _PyObject_VAR_SIZE(tp, tsize); |
|
24894
8862bc59685a
Inline call to _PyObject_GetDictPtr() in PyObject_GenericGetAttr().
Guido van Rossum <guido@python.org>
parents:
24644
diff
changeset
|
1060 |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1061 dictoffset += (long)size; |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1062 assert(dictoffset > 0); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1063 assert(dictoffset % SIZEOF_VOID_P == 0); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1064 } |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1065 dictptr = (PyObject **) ((char *)obj + dictoffset); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1066 dict = *dictptr; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1067 } |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1068 } |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1069 if (dict != NULL) { |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1070 Py_INCREF(dict); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1071 res = PyDict_GetItem(dict, name); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1072 if (res != NULL) { |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1073 Py_INCREF(res); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1074 Py_DECREF(dict); |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1075 goto done; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1076 } |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1077 Py_DECREF(dict); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1078 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1079 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1080 if (f != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1081 res = f(descr, obj, (PyObject *)Py_TYPE(obj)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1082 goto done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1083 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1084 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1085 if (descr != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1086 res = descr; |
|
75498
579f845ac396
Issue #14211: _PyObject_GenericSetAttrWithDict() keeps a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents:
75254
diff
changeset
|
1087 descr = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1088 goto done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1089 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1090 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1091 PyErr_Format(PyExc_AttributeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1092 "'%.50s' object has no attribute '%U'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1093 tp->tp_name, name); |
|
21186
0189186f4ed9
PyObject_Generic{Get,Set}Attr(): ensure that the attribute name is a
Guido van Rossum <guido@python.org>
parents:
20865
diff
changeset
|
1094 done: |
|
75498
579f845ac396
Issue #14211: _PyObject_GenericSetAttrWithDict() keeps a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents:
75254
diff
changeset
|
1095 Py_XDECREF(descr); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1096 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1097 return res; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1098 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1099 |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1100 PyObject * |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1101 PyObject_GenericGetAttr(PyObject *obj, PyObject *name) |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1102 { |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1103 return _PyObject_GenericGetAttrWithDict(obj, name, NULL); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1104 } |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1105 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1106 int |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1107 _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1108 PyObject *value, PyObject *dict) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1109 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1110 PyTypeObject *tp = Py_TYPE(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1111 PyObject *descr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1112 descrsetfunc f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1113 PyObject **dictptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1114 int res = -1; |
|
21186
0189186f4ed9
PyObject_Generic{Get,Set}Attr(): ensure that the attribute name is a
Guido van Rossum <guido@python.org>
parents:
20865
diff
changeset
|
1115 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1116 if (!PyUnicode_Check(name)){ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1117 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1118 "attribute name must be string, not '%.200s'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1119 name->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1120 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1121 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1122 |
|
75508
46e600fa8d05
refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents:
75498
diff
changeset
|
1123 if (tp->tp_dict == NULL && PyType_Ready(tp) < 0) |
|
46e600fa8d05
refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents:
75498
diff
changeset
|
1124 return -1; |
|
46e600fa8d05
refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents:
75498
diff
changeset
|
1125 |
|
46e600fa8d05
refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents:
75498
diff
changeset
|
1126 Py_INCREF(name); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1127 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1128 descr = _PyType_Lookup(tp, name); |
|
75498
579f845ac396
Issue #14211: _PyObject_GenericSetAttrWithDict() keeps a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents:
75254
diff
changeset
|
1129 Py_XINCREF(descr); |
|
579f845ac396
Issue #14211: _PyObject_GenericSetAttrWithDict() keeps a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents:
75254
diff
changeset
|
1130 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1131 f = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1132 if (descr != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1133 f = descr->ob_type->tp_descr_set; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1134 if (f != NULL && PyDescr_IsData(descr)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1135 res = f(descr, obj, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1136 goto done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1137 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1138 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1139 |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1140 if (dict == NULL) { |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1141 dictptr = _PyObject_GetDictPtr(obj); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1142 if (dictptr != NULL) { |
|
76485
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76193
diff
changeset
|
1143 res = _PyObjectDict_SetItem(Py_TYPE(obj), dictptr, name, value); |
|
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76193
diff
changeset
|
1144 if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) |
|
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76193
diff
changeset
|
1145 PyErr_SetObject(PyExc_AttributeError, name); |
|
6e5855854a2e
Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents:
76193
diff
changeset
|
1146 goto done; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1147 } |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1148 } |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1149 if (dict != NULL) { |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1150 Py_INCREF(dict); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1151 if (value == NULL) |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1152 res = PyDict_DelItem(dict, name); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1153 else |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1154 res = PyDict_SetItem(dict, name, value); |
|
75508
46e600fa8d05
refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents:
75498
diff
changeset
|
1155 Py_DECREF(dict); |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1156 if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1157 PyErr_SetObject(PyExc_AttributeError, name); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1158 goto done; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1159 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1160 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1161 if (f != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1162 res = f(descr, obj, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1163 goto done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1164 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1165 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1166 if (descr == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1167 PyErr_Format(PyExc_AttributeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1168 "'%.100s' object has no attribute '%U'", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1169 tp->tp_name, name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1170 goto done; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1171 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18887
diff
changeset
|
1172 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1173 PyErr_Format(PyExc_AttributeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1174 "'%.50s' object attribute '%U' is read-only", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1175 tp->tp_name, name); |
|
21186
0189186f4ed9
PyObject_Generic{Get,Set}Attr(): ensure that the attribute name is a
Guido van Rossum <guido@python.org>
parents:
20865
diff
changeset
|
1176 done: |
|
75498
579f845ac396
Issue #14211: _PyObject_GenericSetAttrWithDict() keeps a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents:
75254
diff
changeset
|
1177 Py_XDECREF(descr); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1178 Py_DECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1179 return res; |
|
5560
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
1180 } |
|
8ec298b255a2
Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents:
5535
diff
changeset
|
1181 |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1182 int |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1183 PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value) |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1184 { |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1185 return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL); |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1186 } |
|
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1187 |
|
75050
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1188 int |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1189 PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context) |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1190 { |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1191 PyObject *dict, **dictptr = _PyObject_GetDictPtr(obj); |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1192 if (dictptr == NULL) { |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1193 PyErr_SetString(PyExc_AttributeError, |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1194 "This object has no __dict__"); |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1195 return -1; |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1196 } |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1197 if (value == NULL) { |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1198 PyErr_SetString(PyExc_TypeError, "cannot delete __dict__"); |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1199 return -1; |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1200 } |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1201 if (!PyDict_Check(value)) { |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1202 PyErr_Format(PyExc_TypeError, |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1203 "__dict__ must be set to a dictionary, " |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1204 "not a '%.200s'", Py_TYPE(value)->tp_name); |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1205 return -1; |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1206 } |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1207 dict = *dictptr; |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1208 Py_XINCREF(value); |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1209 *dictptr = value; |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1210 Py_XDECREF(dict); |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1211 return 0; |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1212 } |
|
78f93eb7dd75
add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents:
74578
diff
changeset
|
1213 |
|
64299
4c978cd3640f
Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
63247
diff
changeset
|
1214 |
|
1282
e0464e7115ca
* pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1215 /* Test a value used as condition, e.g., in a for or if statement. |
|
e0464e7115ca
* pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1216 Return -1 if an error occurred */ |
|
e0464e7115ca
* pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1217 |
|
e0464e7115ca
* pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1218 int |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1219 PyObject_IsTrue(PyObject *v) |
|
1282
e0464e7115ca
* pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1220 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1221 Py_ssize_t res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1222 if (v == Py_True) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1223 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1224 if (v == Py_False) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1225 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1226 if (v == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1227 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1228 else if (v->ob_type->tp_as_number != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1229 v->ob_type->tp_as_number->nb_bool != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1230 res = (*v->ob_type->tp_as_number->nb_bool)(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1231 else if (v->ob_type->tp_as_mapping != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1232 v->ob_type->tp_as_mapping->mp_length != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1233 res = (*v->ob_type->tp_as_mapping->mp_length)(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1234 else if (v->ob_type->tp_as_sequence != NULL && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1235 v->ob_type->tp_as_sequence->sq_length != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1236 res = (*v->ob_type->tp_as_sequence->sq_length)(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1237 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1238 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1239 /* if it is negative, it should be either -1 or -2 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1240 return (res > 0) ? 1 : Py_SAFE_DOWNCAST(res, Py_ssize_t, int); |
|
1282
e0464e7115ca
* pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1241 } |
|
e0464e7115ca
* pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1242 |
|
24122
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1243 /* equivalent of 'not v' |
| 7935 | 1244 Return -1 if an error occurred */ |
| 1245 | |
| 1246 int | |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1247 PyObject_Not(PyObject *v) |
| 7935 | 1248 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1249 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1250 res = PyObject_IsTrue(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1251 if (res < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1252 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1253 return res == 0; |
| 7935 | 1254 } |
| 1255 | |
| 2237 | 1256 /* Test whether an object can be called */ |
| 1257 | |
| 1258 int | |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1259 PyCallable_Check(PyObject *x) |
| 2237 | 1260 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1261 if (x == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1262 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1263 return x->ob_type->tp_call != NULL; |
| 2237 | 1264 } |
| 1265 | |
|
19705
b7f6fbc087a7
At Guido's suggestion, here's a new C API function, PyObject_Dir(), like
Tim Peters <tim.peters@gmail.com>
parents:
19633
diff
changeset
|
1266 |
|
41107
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1267 /* Helper for PyObject_Dir without arguments: returns the local scope. */ |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1268 static PyObject * |
|
41450
d1c3dd184e38
Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents:
41124
diff
changeset
|
1269 _dir_locals(void) |
|
19932
621ed13445de
PyObject_Dir(): Merge in __members__ and __methods__ too (if they exist,
Tim Peters <tim.peters@gmail.com>
parents:
19931
diff
changeset
|
1270 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1271 PyObject *names; |
|
86715
4ef4578db38a
Issue #18408: Add a new PyFrame_FastToLocalsWithError() function to handle
Victor Stinner <victor.stinner@gmail.com>
parents:
85607
diff
changeset
|
1272 PyObject *locals; |
|
19932
621ed13445de
PyObject_Dir(): Merge in __members__ and __methods__ too (if they exist,
Tim Peters <tim.peters@gmail.com>
parents:
19931
diff
changeset
|
1273 |
|
86715
4ef4578db38a
Issue #18408: Add a new PyFrame_FastToLocalsWithError() function to handle
Victor Stinner <victor.stinner@gmail.com>
parents:
85607
diff
changeset
|
1274 locals = PyEval_GetLocals(); |
|
4ef4578db38a
Issue #18408: Add a new PyFrame_FastToLocalsWithError() function to handle
Victor Stinner <victor.stinner@gmail.com>
parents:
85607
diff
changeset
|
1275 if (locals == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1276 return NULL; |
|
19932
621ed13445de
PyObject_Dir(): Merge in __members__ and __methods__ too (if they exist,
Tim Peters <tim.peters@gmail.com>
parents:
19931
diff
changeset
|
1277 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1278 names = PyMapping_Keys(locals); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1279 if (!names) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1280 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1281 if (!PyList_Check(names)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1282 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1283 "dir(): expected keys() of locals to be a list, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1284 "not '%.200s'", Py_TYPE(names)->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1285 Py_DECREF(names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1286 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1287 } |
|
70801
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1288 if (PyList_Sort(names)) { |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1289 Py_DECREF(names); |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1290 return NULL; |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1291 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1292 /* the locals don't need to be DECREF'd */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1293 return names; |
|
41107
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1294 } |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1295 |
|
70331
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
70314
diff
changeset
|
1296 /* Helper for PyObject_Dir: object introspection. */ |
|
41107
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1297 static PyObject * |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1298 _dir_object(PyObject *obj) |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1299 { |
|
70801
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1300 PyObject *result, *sorted; |
|
74578
7d96679c5d46
use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents:
74416
diff
changeset
|
1301 PyObject *dirfunc = _PyObject_LookupSpecial(obj, &PyId___dir__); |
|
41107
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1302 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1303 assert(obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1304 if (dirfunc == NULL) { |
|
70331
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
70314
diff
changeset
|
1305 if (!PyErr_Occurred()) |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
70314
diff
changeset
|
1306 PyErr_SetString(PyExc_TypeError, "object does not provide __dir__"); |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
70314
diff
changeset
|
1307 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1308 } |
|
70331
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
70314
diff
changeset
|
1309 /* use __dir__ */ |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
70314
diff
changeset
|
1310 result = PyObject_CallFunctionObjArgs(dirfunc, NULL); |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
70314
diff
changeset
|
1311 Py_DECREF(dirfunc); |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
70314
diff
changeset
|
1312 if (result == NULL) |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
70314
diff
changeset
|
1313 return NULL; |
|
70801
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1314 /* return sorted(result) */ |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1315 sorted = PySequence_List(result); |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1316 Py_DECREF(result); |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1317 if (sorted == NULL) |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1318 return NULL; |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1319 if (PyList_Sort(sorted)) { |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1320 Py_DECREF(sorted); |
|
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1321 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1322 } |
|
70801
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1323 return sorted; |
|
41107
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1324 } |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1325 |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1326 /* Implementation of dir() -- if obj is NULL, returns the names in the current |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1327 (local) scope. Otherwise, performs introspection of the object: returns a |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1328 sorted list of attribute names (supposedly) accessible from the object |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1329 */ |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1330 PyObject * |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1331 PyObject_Dir(PyObject *obj) |
|
cf452027073e
Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents:
40737
diff
changeset
|
1332 { |
|
70801
f74fceebf853
allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
1333 return (obj == NULL) ? _dir_locals() : _dir_object(obj); |
|
19705
b7f6fbc087a7
At Guido's suggestion, here's a new C API function, PyObject_Dir(), like
Tim Peters <tim.peters@gmail.com>
parents:
19633
diff
changeset
|
1334 } |
| 2237 | 1335 |
| 6 | 1336 /* |
|
71542
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1337 None is a non-NULL undefined value. |
| 6 | 1338 There is (and should be!) no way to create other objects of this type, |
| 86 | 1339 so there is exactly one (which is indestructible, by the way). |
| 6 | 1340 */ |
| 1341 | |
| 739 | 1342 /* ARGSUSED */ |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5006
diff
changeset
|
1343 static PyObject * |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1344 none_repr(PyObject *op) |
| 86 | 1345 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1346 return PyUnicode_FromString("None"); |
| 6 | 1347 } |
| 1348 | |
|
16165
0a72070eab6e
A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents:
16123
diff
changeset
|
1349 /* ARGUSED */ |
|
0a72070eab6e
A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents:
16123
diff
changeset
|
1350 static void |
|
24122
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1351 none_dealloc(PyObject* ignore) |
|
16165
0a72070eab6e
A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents:
16123
diff
changeset
|
1352 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1353 /* This should never get called, but we also don't want to SEGV if |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1354 * we accidentally decref None out of existence. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1355 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1356 Py_FatalError("deallocating None"); |
|
16165
0a72070eab6e
A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents:
16123
diff
changeset
|
1357 } |
|
0a72070eab6e
A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents:
16123
diff
changeset
|
1358 |
|
71614
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1359 static PyObject * |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1360 none_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1361 { |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1362 if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_Size(kwargs))) { |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1363 PyErr_SetString(PyExc_TypeError, "NoneType takes no arguments"); |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1364 return NULL; |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1365 } |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1366 Py_RETURN_NONE; |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1367 } |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1368 |
|
71542
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1369 static int |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1370 none_bool(PyObject *v) |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1371 { |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1372 return 0; |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1373 } |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1374 |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1375 static PyNumberMethods none_as_number = { |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1376 0, /* nb_add */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1377 0, /* nb_subtract */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1378 0, /* nb_multiply */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1379 0, /* nb_remainder */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1380 0, /* nb_divmod */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1381 0, /* nb_power */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1382 0, /* nb_negative */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1383 0, /* nb_positive */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1384 0, /* nb_absolute */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1385 (inquiry)none_bool, /* nb_bool */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1386 0, /* nb_invert */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1387 0, /* nb_lshift */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1388 0, /* nb_rshift */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1389 0, /* nb_and */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1390 0, /* nb_xor */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1391 0, /* nb_or */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1392 0, /* nb_int */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1393 0, /* nb_reserved */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1394 0, /* nb_float */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1395 0, /* nb_inplace_add */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1396 0, /* nb_inplace_subtract */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1397 0, /* nb_inplace_multiply */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1398 0, /* nb_inplace_remainder */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1399 0, /* nb_inplace_power */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1400 0, /* nb_inplace_lshift */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1401 0, /* nb_inplace_rshift */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1402 0, /* nb_inplace_and */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1403 0, /* nb_inplace_xor */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1404 0, /* nb_inplace_or */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1405 0, /* nb_floor_divide */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1406 0, /* nb_true_divide */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1407 0, /* nb_inplace_floor_divide */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1408 0, /* nb_inplace_true_divide */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1409 0, /* nb_index */ |
|
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1410 }; |
|
16165
0a72070eab6e
A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents:
16123
diff
changeset
|
1411 |
|
87670
9fcba15d7685
Issue #6477: Keep PyNotImplemented_Type and PyNone_Type private.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87665
diff
changeset
|
1412 PyTypeObject _PyNone_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1413 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1414 "NoneType", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1415 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1416 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1417 none_dealloc, /*tp_dealloc*/ /*never called*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1418 0, /*tp_print*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1419 0, /*tp_getattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1420 0, /*tp_setattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1421 0, /*tp_reserved*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1422 none_repr, /*tp_repr*/ |
|
71542
ccce01988603
Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents:
70802
diff
changeset
|
1423 &none_as_number, /*tp_as_number*/ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1424 0, /*tp_as_sequence*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1425 0, /*tp_as_mapping*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1426 0, /*tp_hash */ |
|
71614
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1427 0, /*tp_call */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1428 0, /*tp_str */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1429 0, /*tp_getattro */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1430 0, /*tp_setattro */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1431 0, /*tp_as_buffer */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1432 Py_TPFLAGS_DEFAULT, /*tp_flags */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1433 0, /*tp_doc */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1434 0, /*tp_traverse */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1435 0, /*tp_clear */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1436 0, /*tp_richcompare */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1437 0, /*tp_weaklistoffset */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1438 0, /*tp_iter */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1439 0, /*tp_iternext */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1440 0, /*tp_methods */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1441 0, /*tp_members */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1442 0, /*tp_getset */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1443 0, /*tp_base */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1444 0, /*tp_dict */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1445 0, /*tp_descr_get */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1446 0, /*tp_descr_set */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1447 0, /*tp_dictoffset */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1448 0, /*tp_init */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1449 0, /*tp_alloc */ |
|
84c3be27b4c7
make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents:
71542
diff
changeset
|
1450 none_new, /*tp_new */ |
| 6 | 1451 }; |
| 1452 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5006
diff
changeset
|
1453 PyObject _Py_NoneStruct = { |
|
42334
e70cdce0e8b2
Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
42196
diff
changeset
|
1454 _PyObject_EXTRA_INIT |
|
87670
9fcba15d7685
Issue #6477: Keep PyNotImplemented_Type and PyNone_Type private.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87665
diff
changeset
|
1455 1, &_PyNone_Type |
| 6 | 1456 }; |
| 1457 | |
|
15726
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1458 /* NotImplemented is an object that can be used to signal that an |
|
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1459 operation is not implemented for the given type combination. */ |
|
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1460 |
|
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1461 static PyObject * |
|
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1462 NotImplemented_repr(PyObject *op) |
|
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1463 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1464 return PyUnicode_FromString("NotImplemented"); |
|
15726
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1465 } |
|
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1466 |
|
71616
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1467 static PyObject * |
|
87494
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1468 NotImplemented_reduce(PyObject *op) |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1469 { |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1470 return PyUnicode_FromString("NotImplemented"); |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1471 } |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1472 |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1473 static PyMethodDef notimplemented_methods[] = { |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1474 {"__reduce__", (PyCFunction)NotImplemented_reduce, METH_NOARGS, NULL}, |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1475 {NULL, NULL} |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1476 }; |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1477 |
|
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1478 static PyObject * |
|
71616
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1479 notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1480 { |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1481 if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_Size(kwargs))) { |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1482 PyErr_SetString(PyExc_TypeError, "NotImplementedType takes no arguments"); |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1483 return NULL; |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1484 } |
|
71810
d0b0fcbb40db
Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents:
71623
diff
changeset
|
1485 Py_RETURN_NOTIMPLEMENTED; |
|
71616
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1486 } |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1487 |
|
79513
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1488 static void |
|
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1489 notimplemented_dealloc(PyObject* ignore) |
|
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1490 { |
|
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1491 /* This should never get called, but we also don't want to SEGV if |
|
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1492 * we accidentally decref NotImplemented out of existence. |
|
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1493 */ |
|
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1494 Py_FatalError("deallocating NotImplemented"); |
|
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1495 } |
|
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1496 |
|
87670
9fcba15d7685
Issue #6477: Keep PyNotImplemented_Type and PyNone_Type private.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87665
diff
changeset
|
1497 PyTypeObject _PyNotImplemented_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1498 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1499 "NotImplementedType", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1500 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1501 0, |
|
79513
75d3a783d728
Added notimplemented_dealloc for better error reporting
Armin Ronacher <armin.ronacher@active-4.com>
parents:
78921
diff
changeset
|
1502 notimplemented_dealloc, /*tp_dealloc*/ /*never called*/ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1503 0, /*tp_print*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1504 0, /*tp_getattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1505 0, /*tp_setattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1506 0, /*tp_reserved*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1507 NotImplemented_repr, /*tp_repr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1508 0, /*tp_as_number*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1509 0, /*tp_as_sequence*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1510 0, /*tp_as_mapping*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1511 0, /*tp_hash */ |
|
71616
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1512 0, /*tp_call */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1513 0, /*tp_str */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1514 0, /*tp_getattro */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1515 0, /*tp_setattro */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1516 0, /*tp_as_buffer */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1517 Py_TPFLAGS_DEFAULT, /*tp_flags */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1518 0, /*tp_doc */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1519 0, /*tp_traverse */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1520 0, /*tp_clear */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1521 0, /*tp_richcompare */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1522 0, /*tp_weaklistoffset */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1523 0, /*tp_iter */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1524 0, /*tp_iternext */ |
|
87494
04ccb2e0307e
Make Ellipsis and NotImplemented picklable through the reduce protocol.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87288
diff
changeset
|
1525 notimplemented_methods, /*tp_methods */ |
|
71616
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1526 0, /*tp_members */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1527 0, /*tp_getset */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1528 0, /*tp_base */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1529 0, /*tp_dict */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1530 0, /*tp_descr_get */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1531 0, /*tp_descr_set */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1532 0, /*tp_dictoffset */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1533 0, /*tp_init */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1534 0, /*tp_alloc */ |
|
2428c239d848
also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents:
71614
diff
changeset
|
1535 notimplemented_new, /*tp_new */ |
|
15726
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1536 }; |
|
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1537 |
|
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1538 PyObject _Py_NotImplementedStruct = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1539 _PyObject_EXTRA_INIT |
|
87670
9fcba15d7685
Issue #6477: Keep PyNotImplemented_Type and PyNone_Type private.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87665
diff
changeset
|
1540 1, &_PyNotImplemented_Type |
|
15726
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1541 }; |
|
db9f1893be01
Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
1542 |
|
19294
1456ec735087
Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents:
19293
diff
changeset
|
1543 void |
|
1456ec735087
Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents:
19293
diff
changeset
|
1544 _Py_ReadyTypes(void) |
|
1456ec735087
Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents:
19293
diff
changeset
|
1545 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1546 if (PyType_Ready(&PyType_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1547 Py_FatalError("Can't initialize type type"); |
|
19294
1456ec735087
Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents:
19293
diff
changeset
|
1548 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1549 if (PyType_Ready(&_PyWeakref_RefType) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1550 Py_FatalError("Can't initialize weakref type"); |
|
32472
4383db77b19a
Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents:
32463
diff
changeset
|
1551 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1552 if (PyType_Ready(&_PyWeakref_CallableProxyType) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1553 Py_FatalError("Can't initialize callable weakref proxy type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1554 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1555 if (PyType_Ready(&_PyWeakref_ProxyType) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1556 Py_FatalError("Can't initialize weakref proxy type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1557 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1558 if (PyType_Ready(&PyBool_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1559 Py_FatalError("Can't initialize bool type"); |
|
22785
aa8d59823add
Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents:
22649
diff
changeset
|
1560 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1561 if (PyType_Ready(&PyByteArray_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1562 Py_FatalError("Can't initialize bytearray type"); |
|
37927
a7f3765ea464
Here is a bytes type. It's very minimal but it's a start.
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
1563 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1564 if (PyType_Ready(&PyBytes_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1565 Py_FatalError("Can't initialize 'str'"); |
|
23542
220b98f06415
- A new type object, 'string', is added. This is a common base type
Guido van Rossum <guido@python.org>
parents:
23436
diff
changeset
|
1566 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1567 if (PyType_Ready(&PyList_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1568 Py_FatalError("Can't initialize list type"); |
|
19294
1456ec735087
Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents:
19293
diff
changeset
|
1569 |
|
87670
9fcba15d7685
Issue #6477: Keep PyNotImplemented_Type and PyNone_Type private.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87665
diff
changeset
|
1570 if (PyType_Ready(&_PyNone_Type) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1571 Py_FatalError("Can't initialize None type"); |
|
19294
1456ec735087
Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents:
19293
diff
changeset
|
1572 |
|
87670
9fcba15d7685
Issue #6477: Keep PyNotImplemented_Type and PyNone_Type private.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
87665
diff
changeset
|
1573 if (PyType_Ready(&_PyNotImplemented_Type) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1574 Py_FatalError("Can't initialize NotImplemented type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1575 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1576 if (PyType_Ready(&PyTraceBack_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1577 Py_FatalError("Can't initialize traceback type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1578 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1579 if (PyType_Ready(&PySuper_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1580 Py_FatalError("Can't initialize super type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1581 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1582 if (PyType_Ready(&PyBaseObject_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1583 Py_FatalError("Can't initialize object type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1584 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1585 if (PyType_Ready(&PyRange_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1586 Py_FatalError("Can't initialize range type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1587 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1588 if (PyType_Ready(&PyDict_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1589 Py_FatalError("Can't initialize dict type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1590 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1591 if (PyType_Ready(&PySet_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1592 Py_FatalError("Can't initialize set type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1593 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1594 if (PyType_Ready(&PyUnicode_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1595 Py_FatalError("Can't initialize str type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1596 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1597 if (PyType_Ready(&PySlice_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1598 Py_FatalError("Can't initialize slice type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1599 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1600 if (PyType_Ready(&PyStaticMethod_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1601 Py_FatalError("Can't initialize static method type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1602 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1603 if (PyType_Ready(&PyComplex_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1604 Py_FatalError("Can't initialize complex type"); |
|
56594
0f9e8d3ecac3
Issue 7147 - remove ability to attempt to build Python without complex number support (was broken anyway)
Skip Montanaro <skip@pobox.com>
parents:
55646
diff
changeset
|
1605 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1606 if (PyType_Ready(&PyFloat_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1607 Py_FatalError("Can't initialize float type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1608 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1609 if (PyType_Ready(&PyLong_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1610 Py_FatalError("Can't initialize int type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1611 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1612 if (PyType_Ready(&PyFrozenSet_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1613 Py_FatalError("Can't initialize frozenset type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1614 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1615 if (PyType_Ready(&PyProperty_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1616 Py_FatalError("Can't initialize property type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1617 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
75129
diff
changeset
|
1618 if (PyType_Ready(&_PyManagedBuffer_Type) < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
75129
diff
changeset
|
1619 Py_FatalError("Can't initialize managed buffer type"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
75129
diff
changeset
|
1620 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1621 if (PyType_Ready(&PyMemoryView_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1622 Py_FatalError("Can't initialize memoryview type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1623 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1624 if (PyType_Ready(&PyTuple_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1625 Py_FatalError("Can't initialize tuple type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1626 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1627 if (PyType_Ready(&PyEnum_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1628 Py_FatalError("Can't initialize enumerate type"); |
|
53244
6ec3df375f5a
Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52870
diff
changeset
|
1629 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1630 if (PyType_Ready(&PyReversed_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1631 Py_FatalError("Can't initialize reversed type"); |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39623
diff
changeset
|
1632 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1633 if (PyType_Ready(&PyStdPrinter_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1634 Py_FatalError("Can't initialize StdPrinter"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1635 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1636 if (PyType_Ready(&PyCode_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1637 Py_FatalError("Can't initialize code type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1638 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1639 if (PyType_Ready(&PyFrame_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1640 Py_FatalError("Can't initialize frame type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1641 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1642 if (PyType_Ready(&PyCFunction_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1643 Py_FatalError("Can't initialize builtin function type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1644 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1645 if (PyType_Ready(&PyMethod_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1646 Py_FatalError("Can't initialize method type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1647 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1648 if (PyType_Ready(&PyFunction_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1649 Py_FatalError("Can't initialize function type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1650 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1651 if (PyType_Ready(&PyDictProxy_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1652 Py_FatalError("Can't initialize dict proxy type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1653 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1654 if (PyType_Ready(&PyGen_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1655 Py_FatalError("Can't initialize generator type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1656 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1657 if (PyType_Ready(&PyGetSetDescr_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1658 Py_FatalError("Can't initialize get-set descriptor type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1659 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1660 if (PyType_Ready(&PyWrapperDescr_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1661 Py_FatalError("Can't initialize wrapper type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1662 |
|
72165
51e27f42beda
make sure to initialize the method wrapper type
Benjamin Peterson <benjamin@python.org>
parents:
71622
diff
changeset
|
1663 if (PyType_Ready(&_PyMethodWrapper_Type) < 0) |
|
51e27f42beda
make sure to initialize the method wrapper type
Benjamin Peterson <benjamin@python.org>
parents:
71622
diff
changeset
|
1664 Py_FatalError("Can't initialize method wrapper type"); |
|
51e27f42beda
make sure to initialize the method wrapper type
Benjamin Peterson <benjamin@python.org>
parents:
71622
diff
changeset
|
1665 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1666 if (PyType_Ready(&PyEllipsis_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1667 Py_FatalError("Can't initialize ellipsis type"); |
|
53274
8533cfc2420a
Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53244
diff
changeset
|
1668 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1669 if (PyType_Ready(&PyMemberDescr_Type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1670 Py_FatalError("Can't initialize member descriptor type"); |
|
53953
261f594014c6
these builtins have to be initialized
Benjamin Peterson <benjamin@python.org>
parents:
53906
diff
changeset
|
1671 |
|
77339
9c445f4695c1
Eric Snow's implementation of PEP 421.
Barry Warsaw <barry@python.org>
parents:
76485
diff
changeset
|
1672 if (PyType_Ready(&_PyNamespace_Type) < 0) |
|
9c445f4695c1
Eric Snow's implementation of PEP 421.
Barry Warsaw <barry@python.org>
parents:
76485
diff
changeset
|
1673 Py_FatalError("Can't initialize namespace type"); |
| 80073 | 1674 |
|
80072
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1675 if (PyType_Ready(&PyCapsule_Type) < 0) |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1676 Py_FatalError("Can't initialize capsule type"); |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1677 |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1678 if (PyType_Ready(&PyLongRangeIter_Type) < 0) |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1679 Py_FatalError("Can't initialize long range iterator type"); |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1680 |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1681 if (PyType_Ready(&PyCell_Type) < 0) |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1682 Py_FatalError("Can't initialize cell type"); |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1683 |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1684 if (PyType_Ready(&PyInstanceMethod_Type) < 0) |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1685 Py_FatalError("Can't initialize instance method type"); |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1686 |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1687 if (PyType_Ready(&PyClassMethodDescr_Type) < 0) |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1688 Py_FatalError("Can't initialize class method descr type"); |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1689 |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1690 if (PyType_Ready(&PyMethodDescr_Type) < 0) |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1691 Py_FatalError("Can't initialize method descr type"); |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1692 |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1693 if (PyType_Ready(&PyCallIter_Type) < 0) |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1694 Py_FatalError("Can't initialize call iter type"); |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1695 |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1696 if (PyType_Ready(&PySeqIter_Type) < 0) |
|
eec0cafe171d
initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents:
78856
diff
changeset
|
1697 Py_FatalError("Can't initialize sequence iterator type"); |
|
19294
1456ec735087
Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents:
19293
diff
changeset
|
1698 } |
|
1456ec735087
Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents:
19293
diff
changeset
|
1699 |
| 6 | 1700 |
|
3574
1ec154241747
TRACE_REFS -> Py_TRACE_REFS.
Guido van Rossum <guido@python.org>
parents:
3330
diff
changeset
|
1701 #ifdef Py_TRACE_REFS |
| 6 | 1702 |
|
4002
4241582636ad
Define reference count admin debug functions to return void.
Guido van Rossum <guido@python.org>
parents:
3986
diff
changeset
|
1703 void |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1704 _Py_NewReference(PyObject *op) |
| 6 | 1705 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1706 _Py_INC_REFTOTAL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1707 op->ob_refcnt = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1708 _Py_AddToAllObjects(op, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1709 _Py_INC_TPALLOCS(op); |
| 6 | 1710 } |
| 1711 | |
|
4002
4241582636ad
Define reference count admin debug functions to return void.
Guido van Rossum <guido@python.org>
parents:
3986
diff
changeset
|
1712 void |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84911
diff
changeset
|
1713 _Py_ForgetReference(PyObject *op) |
| 6 | 1714 { |
|
11673
5e6e9e893acd
The rest of the changes by Trent Mick and Dale Nagata for warning-free
Guido van Rossum <guido@python.org>
parents:
11649
diff
changeset
|
1715 #ifdef SLOW_UNREF_CHECK |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84911
diff
changeset
|
1716 PyObject *p; |
|
11673
5e6e9e893acd
The rest of the changes by Trent Mick and Dale Nagata for warning-free
Guido van Rossum <guido@python.org>
parents:
11649
diff
changeset
|
1717 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1718 if (op->ob_refcnt < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1719 Py_FatalError("UNREF negative refcnt"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1720 if (op == &refchain || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1721 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1722 fprintf(stderr, "* ob\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1723 _PyObject_Dump(op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1724 fprintf(stderr, "* op->_ob_prev->_ob_next\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1725 _PyObject_Dump(op->_ob_prev->_ob_next); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1726 fprintf(stderr, "* op->_ob_next->_ob_prev\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1727 _PyObject_Dump(op->_ob_next->_ob_prev); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1728 Py_FatalError("UNREF invalid object"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1729 } |
|
1017
cb7ef9bd9ede
If a type has a repr function but no print function, printing it now
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1730 #ifdef SLOW_UNREF_CHECK |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1731 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1732 if (p == op) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1733 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1734 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1735 if (p == &refchain) /* Not found */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1736 Py_FatalError("UNREF unknown object"); |
|
1017
cb7ef9bd9ede
If a type has a repr function but no print function, printing it now
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1737 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1738 op->_ob_next->_ob_prev = op->_ob_prev; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1739 op->_ob_prev->_ob_next = op->_ob_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1740 op->_ob_next = op->_ob_prev = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1741 _Py_INC_TPFREES(op); |
| 86 | 1742 } |
| 1743 | |
|
4002
4241582636ad
Define reference count admin debug functions to return void.
Guido van Rossum <guido@python.org>
parents:
3986
diff
changeset
|
1744 void |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1745 _Py_Dealloc(PyObject *op) |
| 86 | 1746 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1747 destructor dealloc = Py_TYPE(op)->tp_dealloc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1748 _Py_ForgetReference(op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1749 (*dealloc)(op); |
| 6 | 1750 } |
| 1751 | |
|
28653
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1752 /* Print all live objects. Because PyObject_Print is called, the |
|
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1753 * interpreter must be in a healthy state. |
|
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1754 */ |
|
4002
4241582636ad
Define reference count admin debug functions to return void.
Guido van Rossum <guido@python.org>
parents:
3986
diff
changeset
|
1755 void |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1756 _Py_PrintReferences(FILE *fp) |
| 6 | 1757 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1758 PyObject *op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1759 fprintf(fp, "Remaining objects:\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1760 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1761 fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", op, op->ob_refcnt); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1762 if (PyObject_Print(op, fp, 0) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1763 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1764 putc('\n', fp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1765 } |
| 6 | 1766 } |
| 1767 | |
|
28653
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1768 /* Print the addresses of all live objects. Unlike _Py_PrintReferences, this |
|
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1769 * doesn't make any calls to the Python C API, so is always safe to call. |
|
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1770 */ |
|
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1771 void |
|
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1772 _Py_PrintReferenceAddresses(FILE *fp) |
|
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1773 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1774 PyObject *op; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1775 fprintf(fp, "Remaining object addresses:\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1776 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1777 fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", op, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1778 op->ob_refcnt, Py_TYPE(op)->tp_name); |
|
28653
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1779 } |
|
56006d97bcef
_Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents:
28616
diff
changeset
|
1780 |
|
3024
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
1781 PyObject * |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1782 _Py_GetObjects(PyObject *self, PyObject *args) |
|
3024
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
1783 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1784 int i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1785 PyObject *t = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1786 PyObject *res, *op; |
|
3024
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
1787 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1788 if (!PyArg_ParseTuple(args, "i|O", &n, &t)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1789 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1790 op = refchain._ob_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1791 res = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1792 if (res == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1793 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1794 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1795 while (op == self || op == args || op == res || op == t || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1796 (t != NULL && Py_TYPE(op) != (PyTypeObject *) t)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1797 op = op->_ob_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1798 if (op == &refchain) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1799 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1800 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1801 if (PyList_Append(res, op) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1802 Py_DECREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1803 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1804 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1805 op = op->_ob_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1806 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1807 return res; |
|
3024
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
1808 } |
|
54aa87b1ccee
Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents:
2827
diff
changeset
|
1809 |
| 6 | 1810 #endif |
|
3330
9f1b6e2db8e0
Hack to force loading of cobject.o
Guido van Rossum <guido@python.org>
parents:
3024
diff
changeset
|
1811 |
|
53816
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53274
diff
changeset
|
1812 /* Hack to force loading of pycapsule.o */ |
|
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53274
diff
changeset
|
1813 PyTypeObject *_PyCapsule_hack = &PyCapsule_Type; |
|
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53274
diff
changeset
|
1814 |
|
911df82bc25d
add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents:
53274
diff
changeset
|
1815 |
|
3574
1ec154241747
TRACE_REFS -> Py_TRACE_REFS.
Guido van Rossum <guido@python.org>
parents:
3330
diff
changeset
|
1816 /* Hack to force loading of abstract.o */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
1817 Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size; |
|
5931
12fe5cc1516d
Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents:
5610
diff
changeset
|
1818 |
|
12fe5cc1516d
Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents:
5610
diff
changeset
|
1819 |
|
77577
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1820 void |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1821 _PyObject_DebugTypeStats(FILE *out) |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1822 { |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1823 _PyCFunction_DebugMallocStats(out); |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1824 _PyDict_DebugMallocStats(out); |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1825 _PyFloat_DebugMallocStats(out); |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1826 _PyFrame_DebugMallocStats(out); |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1827 _PyList_DebugMallocStats(out); |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1828 _PyMethod_DebugMallocStats(out); |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1829 _PyTuple_DebugMallocStats(out); |
|
d63a80abfbec
Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents:
77339
diff
changeset
|
1830 } |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12481
diff
changeset
|
1831 |
|
7984
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1832 /* These methods are used to control infinite recursion in repr, str, print, |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1833 etc. Container objects that may recursively contain themselves, |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1834 e.g. builtin dictionaries and lists, should used Py_ReprEnter() and |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1835 Py_ReprLeave() to avoid infinite recursion. |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1836 |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1837 Py_ReprEnter() returns 0 the first time it is called for a particular |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1838 object and 1 every time thereafter. It returns -1 if an exception |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1839 occurred. Py_ReprLeave() has no return value. |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1840 |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1841 See dictobject.c and listobject.c for examples of use. |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1842 */ |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1843 |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1844 int |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1845 Py_ReprEnter(PyObject *obj) |
|
7984
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1846 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1847 PyObject *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1848 PyObject *list; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1849 Py_ssize_t i; |
|
7984
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1850 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1851 dict = PyThreadState_GetDict(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1852 if (dict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1853 return 0; |
|
86967
8a6a920d8eae
Issue #19512: Py_ReprEnter() and Py_ReprLeave() now use an identifier for the
Victor Stinner <victor.stinner@gmail.com>
parents:
86715
diff
changeset
|
1854 list = _PyDict_GetItemId(dict, &PyId_Py_Repr); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1855 if (list == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1856 list = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1857 if (list == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1858 return -1; |
|
86967
8a6a920d8eae
Issue #19512: Py_ReprEnter() and Py_ReprLeave() now use an identifier for the
Victor Stinner <victor.stinner@gmail.com>
parents:
86715
diff
changeset
|
1859 if (_PyDict_SetItemId(dict, &PyId_Py_Repr, list) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1860 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1861 Py_DECREF(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1862 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1863 i = PyList_GET_SIZE(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1864 while (--i >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1865 if (PyList_GET_ITEM(list, i) == obj) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1866 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1867 } |
|
84696
2f5f1db8eb88
Issue #18408: Fix Py_ReprEnter(), handle PyList_Append() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84675
diff
changeset
|
1868 if (PyList_Append(list, obj) < 0) |
|
2f5f1db8eb88
Issue #18408: Fix Py_ReprEnter(), handle PyList_Append() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84675
diff
changeset
|
1869 return -1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1870 return 0; |
|
7984
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1871 } |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1872 |
|
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1873 void |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1874 Py_ReprLeave(PyObject *obj) |
|
7984
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1875 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1876 PyObject *dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1877 PyObject *list; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1878 Py_ssize_t i; |
|
84675
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1879 PyObject *error_type, *error_value, *error_traceback; |
|
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1880 |
|
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1881 PyErr_Fetch(&error_type, &error_value, &error_traceback); |
|
7984
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1882 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1883 dict = PyThreadState_GetDict(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1884 if (dict == NULL) |
|
84675
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1885 goto finally; |
|
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1886 |
|
86967
8a6a920d8eae
Issue #19512: Py_ReprEnter() and Py_ReprLeave() now use an identifier for the
Victor Stinner <victor.stinner@gmail.com>
parents:
86715
diff
changeset
|
1887 list = _PyDict_GetItemId(dict, &PyId_Py_Repr); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1888 if (list == NULL || !PyList_Check(list)) |
|
84675
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1889 goto finally; |
|
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1890 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1891 i = PyList_GET_SIZE(list); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1892 /* Count backwards because we always expect obj to be list[-1] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1893 while (--i >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1894 if (PyList_GET_ITEM(list, i) == obj) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1895 PyList_SetSlice(list, i, i + 1, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1896 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1897 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1898 } |
|
84675
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1899 |
|
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1900 finally: |
|
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1901 /* ignore exceptions because there is no way to report them. */ |
|
28ff7ac91477
Issue #18408: Py_ReprLeave() now saves/restores the current exception,
Victor Stinner <victor.stinner@gmail.com>
parents:
84471
diff
changeset
|
1902 PyErr_Restore(error_type, error_value, error_traceback); |
|
7984
1d0eb2e96d76
Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents:
7935
diff
changeset
|
1903 } |
|
11999
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1904 |
|
24122
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1905 /* Trashcan support. */ |
| 12052 | 1906 |
|
24122
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1907 /* Current call-stack depth of tp_dealloc calls. */ |
|
11999
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1908 int _PyTrash_delete_nesting = 0; |
|
12481
a8898a172fe2
Christian Tismer -- total rewrite on trashcan code.
Guido van Rossum <guido@python.org>
parents:
12406
diff
changeset
|
1909 |
|
24122
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1910 /* List of objects that still need to be cleaned up, singly linked via their |
|
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1911 * gc headers' gc_prev pointers. |
|
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1912 */ |
|
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1913 PyObject *_PyTrash_delete_later = NULL; |
|
11999
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1914 |
|
24122
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1915 /* Add op to the _PyTrash_delete_later list. Called when the current |
|
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1916 * call-stack depth gets large. op must be a currently untracked gc'ed |
|
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1917 * object, with refcount 0. Py_DECREF must already have been called on it. |
|
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1918 */ |
|
11999
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1919 void |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1920 _PyTrash_deposit_object(PyObject *op) |
|
11999
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1921 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1922 assert(PyObject_IS_GC(op)); |
|
84911
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
1923 assert(_PyGC_REFS(op) == _PyGC_REFS_UNTRACKED); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1924 assert(op->ob_refcnt == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1925 _Py_AS_GC(op)->gc.gc_prev = (PyGC_Head *)_PyTrash_delete_later; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1926 _PyTrash_delete_later = op; |
|
11999
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1927 } |
|
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1928 |
|
78856
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1929 /* The equivalent API, using per-thread state recursion info */ |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1930 void |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1931 _PyTrash_thread_deposit_object(PyObject *op) |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1932 { |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1933 PyThreadState *tstate = PyThreadState_GET(); |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1934 assert(PyObject_IS_GC(op)); |
|
84911
3f994367a979
Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents:
84706
diff
changeset
|
1935 assert(_PyGC_REFS(op) == _PyGC_REFS_UNTRACKED); |
|
78856
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1936 assert(op->ob_refcnt == 0); |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1937 _Py_AS_GC(op)->gc.gc_prev = (PyGC_Head *) tstate->trash_delete_later; |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1938 tstate->trash_delete_later = op; |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1939 } |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1940 |
|
24122
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1941 /* Dealloccate all the objects in the _PyTrash_delete_later list. Called when |
|
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1942 * the call-stack unwinds again. |
|
d332484e394a
Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents:
24121
diff
changeset
|
1943 */ |
|
11999
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1944 void |
|
13473
31b1f691a7d9
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13447
diff
changeset
|
1945 _PyTrash_destroy_chain(void) |
|
11999
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1946 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1947 while (_PyTrash_delete_later) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1948 PyObject *op = _PyTrash_delete_later; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1949 destructor dealloc = Py_TYPE(op)->tp_dealloc; |
|
22649
1616bd8b31bc
If the GC is enabled then don't use the ob_type pointer to create a list
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22469
diff
changeset
|
1950 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1951 _PyTrash_delete_later = |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1952 (PyObject*) _Py_AS_GC(op)->gc.gc_prev; |
|
22649
1616bd8b31bc
If the GC is enabled then don't use the ob_type pointer to create a list
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22469
diff
changeset
|
1953 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1954 /* Call the deallocator directly. This used to try to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1955 * fool Py_DECREF into calling it indirectly, but |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1956 * Py_DECREF was already called on this object, and in |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1957 * assorted non-release builds calling Py_DECREF again ends |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1958 * up distorting allocation statistics. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1959 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1960 assert(op->ob_refcnt == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1961 ++_PyTrash_delete_nesting; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1962 (*dealloc)(op); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1963 --_PyTrash_delete_nesting; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59859
diff
changeset
|
1964 } |
|
11999
c94247b5c355
Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents:
11969
diff
changeset
|
1965 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
1966 |
|
78856
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1967 /* The equivalent API, using per-thread state recursion info */ |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1968 void |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1969 _PyTrash_thread_destroy_chain(void) |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1970 { |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1971 PyThreadState *tstate = PyThreadState_GET(); |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1972 while (tstate->trash_delete_later) { |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1973 PyObject *op = tstate->trash_delete_later; |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1974 destructor dealloc = Py_TYPE(op)->tp_dealloc; |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1975 |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1976 tstate->trash_delete_later = |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1977 (PyObject*) _Py_AS_GC(op)->gc.gc_prev; |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1978 |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1979 /* Call the deallocator directly. This used to try to |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1980 * fool Py_DECREF into calling it indirectly, but |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1981 * Py_DECREF was already called on this object, and in |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1982 * assorted non-release builds calling Py_DECREF again ends |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1983 * up distorting allocation statistics. |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1984 */ |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1985 assert(op->ob_refcnt == 0); |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1986 ++tstate->trash_delete_nesting; |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1987 (*dealloc)(op); |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1988 --tstate->trash_delete_nesting; |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1989 } |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1990 } |
|
e72cda3f40a2
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
75073
diff
changeset
|
1991 |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
1992 #ifndef Py_TRACE_REFS |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
1993 /* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc. |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
1994 Define this here, so we can undefine the macro. */ |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
1995 #undef _Py_Dealloc |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
1996 PyAPI_FUNC(void) _Py_Dealloc(PyObject *); |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
1997 void |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
1998 _Py_Dealloc(PyObject *op) |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
1999 { |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
2000 _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
2001 (*Py_TYPE(op)->tp_dealloc)(op); |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
2002 } |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
2003 #endif |
|
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66556
diff
changeset
|
2004 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
2005 #ifdef __cplusplus |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
2006 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36977
diff
changeset
|
2007 #endif |
