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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 95
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
38 /* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
39 These are used by the individual routines for object creation.
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
40 Do not call them otherwise, they do not initialize the object! */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
4f038d3a8878 Typo in comment.
Tim Peters <tim.peters@gmail.com>
parents: 28396
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72166
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
481 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72166
diff changeset
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
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
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
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
776 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
777
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
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
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
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
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
804 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
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
941d49a65f06 Fix for
Michael W. Hudson <mwh@python.net>
parents: 28669
diff changeset
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
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1244 Return -1 if an error occurred */
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1245
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1246 int
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1247 PyObject_Not(PyObject *v)
7935
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
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
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1254 }
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1255
2237
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1256 /* Test whether an object can be called */
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1257
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1258 int
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1259 PyCallable_Check(PyObject *x)
2237
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
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
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1264 }
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
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
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1335
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1338 There is (and should be!) no way to create other objects of this type,
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
1339 so there is exactly one (which is indestructible, by the way).
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1340 */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1341
739
ab1b3486b226 Fix lint bug
Guido van Rossum <guido@python.org>
parents: 512
diff changeset
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
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1347 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1451 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1456 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
9371bf2287c4 merge 3.2 (#16369)
Benjamin Peterson <benjamin@python.org>
parents: 78921 80072
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1700
3574
1ec154241747 TRACE_REFS -> Py_TRACE_REFS.
Guido van Rossum <guido@python.org>
parents: 3330
diff changeset
1701 #ifdef Py_TRACE_REFS
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1710 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
1742 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
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
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1750 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1766 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
5d3165e30bce Christian Tismer:
Guido van Rossum <guido@python.org>
parents: 11999
diff changeset
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