annotate Objects/object.c @ 80779:10d04bdb05ab 3.3

Issue #16248: Disable code execution from the user's home directory by tkinter when the -E flag is passed to Python. Patch by Zachary Ware.
author Antoine Pitrou <solipsis@pitrou.net>
date Sun, 09 Dec 2012 14:46:46 +0100
parents 9371bf2287c4
children 16eba94d3cfe aa52d8559ce5
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
24184
c4dcb80f48ea object.h special-build macro minefield: renamed all the new lexical
Tim Peters <tim.peters@gmail.com>
parents: 24155
diff changeset
11 #ifdef Py_REF_DEBUG
36838
dedc2c94d112 Oops, forgot to include this in the last checkin.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36759
diff changeset
12 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
13
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36977
diff changeset
14 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
15 _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
16 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
17 PyObject *o;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
18 Py_ssize_t total = _Py_RefTotal;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
19 /* 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
20 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
21 hash table code is well-tested) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
22 o = _PyDict_Dummy();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
23 if (o != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
24 total -= o->ob_refcnt;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
25 o = _PySet_Dummy();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
26 if (o != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
27 total -= o->ob_refcnt;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
28 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
29 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36977
diff changeset
30 #endif /* Py_REF_DEBUG */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
32 /* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
33 These are used by the individual routines for object creation.
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
34 Do not call them otherwise, they do not initialize the object! */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
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
36 #ifdef Py_TRACE_REFS
28396
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28389
diff changeset
37 /* 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
38 * 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
39 * 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
40 */
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
41 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
42
28396
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28389
diff changeset
43 /* 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
44 * 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
45 * 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
46 * 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
47 * 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
48 * relinking it into the front.
28396
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28389
diff changeset
49 * 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
50 * 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
51 * 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
52 * 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
53 */
28389
4ede57a42c62 Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents: 28388
diff changeset
54 void
28396
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28389
diff changeset
55 _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
56 {
28396
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28389
diff changeset
57 #ifdef Py_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
58 if (!force) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
59 /* 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
60 * the list unambiguously.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
61 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
62 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
63 }
28396
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28389
diff changeset
64 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
65 if (force || op->_ob_prev == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
66 op->_ob_next = refchain._ob_next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
67 op->_ob_prev = &refchain;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
68 refchain._ob_next->_ob_prev = op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
69 refchain._ob_next = op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
70 }
28389
4ede57a42c62 Refactored some of the Py_TRACE_REFS code. New private API function
Tim Peters <tim.peters@gmail.com>
parents: 28388
diff changeset
71 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
72 #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
73
1347
a22a350d3a5d * Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents: 1324
diff changeset
74 #ifdef COUNT_ALLOCS
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5006
diff changeset
75 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
76 /* 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
77 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
78 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
79 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
80 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
81 once the last object is deallocated. */
50735
27db82a5cda9 Merged revisions 68381 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50374
diff changeset
82 static int unlist_types_without_objects;
27db82a5cda9 Merged revisions 68381 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50374
diff changeset
83 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
84 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
85 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
86 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
87 dump_counts(FILE* f)
1347
a22a350d3a5d * Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents: 1324
diff changeset
88 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
89 PyTypeObject *tp;
1347
a22a350d3a5d * Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents: 1324
diff changeset
90
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
91 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
92 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
93 "freed: %" PY_FORMAT_SIZE_T "d, "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
94 "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
95 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
96 tp->tp_maxalloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
97 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
98 "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
99 fast_tuple_allocs, tuple_zero_allocs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
100 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
101 "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
102 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
103 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
104 "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
105 null_strings, one_strings);
1347
a22a350d3a5d * Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents: 1324
diff changeset
106 }
a22a350d3a5d * Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents: 1324
diff changeset
107
3024
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
108 PyObject *
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
109 get_counts(void)
3024
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
110 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
111 PyTypeObject *tp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
112 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
113 PyObject *v;
3024
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
114
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
115 result = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
116 if (result == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
117 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
118 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
119 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
120 tp->tp_frees, tp->tp_maxalloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
121 if (v == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
122 Py_DECREF(result);
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 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
125 if (PyList_Append(result, v) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
126 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
127 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
128 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
129 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
130 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
131 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
132 return result;
3024
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
133 }
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
134
1347
a22a350d3a5d * Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents: 1324
diff changeset
135 void
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
136 inc_count(PyTypeObject *tp)
1347
a22a350d3a5d * Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents: 1324
diff changeset
137 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
138 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
139 /* first time; insert in linked list */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
140 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
141 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
142 if (type_list)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
143 type_list->tp_prev = tp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
144 tp->tp_next = type_list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
145 /* 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
146 * 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
147 * 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
148 * 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
149 * 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
150 * (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
151 * 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
152 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
153 Py_INCREF(tp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
154 type_list = tp;
28388
f81239c12c60 Oops! Used a wrong preprocessor symbol.
Tim Peters <tim.peters@gmail.com>
parents: 28387
diff changeset
155 #ifdef Py_TRACE_REFS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
156 /* 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
157 * if not already there.
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_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
160 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
161 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
162 tp->tp_allocs++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
163 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
164 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
165 }
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
166
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36977
diff changeset
167 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
168 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
169 tp->tp_frees++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
170 if (unlist_types_without_objects &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
171 tp->tp_allocs == tp->tp_frees) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
172 /* unlink the type from type_list */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
173 if (tp->tp_prev)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
174 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
175 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
176 type_list = tp->tp_next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
177 if (tp->tp_next)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
178 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
179 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
180 Py_DECREF(tp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
181 }
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
182 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36977
diff changeset
183
1347
a22a350d3a5d * Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents: 1324
diff changeset
184 #endif
a22a350d3a5d * Extended X interface: pixmap objects, colormap objects visual objects,
Sjoerd Mullender <sjoerd@acm.org>
parents: 1324
diff changeset
185
24155
9456a2ccda61 The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents: 24144
diff changeset
186 #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
187 /* 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
188 void
9456a2ccda61 The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents: 24144
diff changeset
189 _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
190 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
191 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
192
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
193 PyOS_snprintf(buf, sizeof(buf),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
194 "%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
195 "%" PY_FORMAT_SIZE_T "d",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
196 fname, lineno, op, op->ob_refcnt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
197 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
198 }
9456a2ccda61 The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents: 24144
diff changeset
199
9456a2ccda61 The Py_REF_DEBUG/COUNT_ALLOCS/Py_TRACE_REFS macro minefield: added
Tim Peters <tim.peters@gmail.com>
parents: 24144
diff changeset
200 #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
201
31940
059740d52ae5 Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents: 31738
diff changeset
202 void
059740d52ae5 Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents: 31738
diff changeset
203 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
204 {
059740d52ae5 Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents: 31738
diff changeset
205 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
206 }
059740d52ae5 Two new public API functions, Py_IncRef and Py_DecRef. Useful for
Thomas Heller <theller@ctypes.org>
parents: 31738
diff changeset
207
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_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
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_XDECREF(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
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5006
diff changeset
214 PyObject *
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
215 PyObject_Init(PyObject *op, PyTypeObject *tp)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
217 if (op == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
218 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
219 /* 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
220 Py_TYPE(op) = tp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
221 _Py_NewReference(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
222 return op;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
225 PyVarObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
226 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
227 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
228 if (op == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
229 return (PyVarObject *) PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
230 /* 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
231 op->ob_size = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
232 Py_TYPE(op) = tp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
233 _Py_NewReference((PyObject *)op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
234 return op;
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
235 }
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
236
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
237 PyObject *
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
238 _PyObject_New(PyTypeObject *tp)
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
239 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
240 PyObject *op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
241 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
242 if (op == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
243 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
244 return PyObject_INIT(op, tp);
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
245 }
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
246
5535
20c2b715188e Oops, another forgotten renaming: varobject -> PyVarObject.
Guido van Rossum <guido@python.org>
parents: 5396
diff changeset
247 PyVarObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35999
diff changeset
248 _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
249 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
250 PyVarObject *op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
251 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
252 op = (PyVarObject *) PyObject_MALLOC(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
253 if (op == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
254 return (PyVarObject *)PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
255 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
256 }
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
257
63247
fd9b421cdbaf Merged revisions 83184 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61656
diff changeset
258 int
fd9b421cdbaf Merged revisions 83184 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61656
diff changeset
259 PyObject_Print(PyObject *op, FILE *fp, int flags)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
261 int ret = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
262 if (PyErr_CheckSignals())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
263 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
264 #ifdef USE_STACKCHECK
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
265 if (PyOS_CheckStack()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
266 PyErr_SetString(PyExc_MemoryError, "stack overflow");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
267 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
268 }
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
269 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
270 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
271 if (op == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
272 Py_BEGIN_ALLOW_THREADS
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
273 fprintf(fp, "<nil>");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
274 Py_END_ALLOW_THREADS
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
275 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
276 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
277 if (op->ob_refcnt <= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
278 /* 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
279 universally available */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
280 Py_BEGIN_ALLOW_THREADS
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
281 fprintf(fp, "<refcnt %ld at %p>",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
282 (long)op->ob_refcnt, op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
283 Py_END_ALLOW_THREADS
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
284 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
285 PyObject *s;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
286 if (flags & Py_PRINT_RAW)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
287 s = PyObject_Str(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
288 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
289 s = PyObject_Repr(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
290 if (s == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
291 ret = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
292 else if (PyBytes_Check(s)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
293 fwrite(PyBytes_AS_STRING(s), 1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
294 PyBytes_GET_SIZE(s), fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
295 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
296 else if (PyUnicode_Check(s)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
297 PyObject *t;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 72166
diff changeset
298 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
299 if (t == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
300 ret = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
301 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
302 fwrite(PyBytes_AS_STRING(t), 1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
303 PyBytes_GET_SIZE(t), fp);
61656
ca81646dd29c Merged revisions 81250-81253 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61467
diff changeset
304 Py_DECREF(t);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
305 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
306 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
307 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
308 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
309 "str() or repr() returned '%.100s'",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
310 s->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
311 ret = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
312 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
313 Py_XDECREF(s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
314 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
315 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
316 if (ret == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
317 if (ferror(fp)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
318 PyErr_SetFromErrno(PyExc_IOError);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
319 clearerr(fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
320 ret = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
321 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
322 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
323 return ret;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325
39623
c6d9fa81f20f Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
326 /* 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
327 void
40737
6ebad2a6b990 Merged revisions 53451-53537 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40485
diff changeset
328 _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
329 {
c6d9fa81f20f Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
330 }
c6d9fa81f20f Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
331
27234
e9f45b8efd6b Fix SF bug #667147, Segmentation fault printing str subclass
Neal Norwitz <nnorwitz@gmail.com>
parents: 26263
diff changeset
332
16165
0a72070eab6e A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents: 16123
diff changeset
333 /* 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
334 void
c6d9fa81f20f Change the way __hash__ is inherited; when __eq__ or __cmp__ is overridden
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
335 _PyObject_Dump(PyObject* op)
16165
0a72070eab6e A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents: 16123
diff changeset
336 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
337 if (op == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
338 fprintf(stderr, "NULL\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
339 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
340 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
341 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
342 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
343 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
344 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
345 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
346 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
347 (void)PyObject_Print(op, stderr, 0);
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
348 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
349 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
350 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
351 /* 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
352 universally available */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
353 fprintf(stderr, "\n"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
354 "type : %s\n"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
355 "refcount: %ld\n"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
356 "address : %p\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
357 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
358 (long)op->ob_refcnt,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
359 op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
360 }
16165
0a72070eab6e A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents: 16123
diff changeset
361 }
16167
71ceaba3f615 PyObject_Dump(): Use %p format to print the address of the pointer.
Barry Warsaw <barry@python.org>
parents: 16165
diff changeset
362
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5006
diff changeset
363 PyObject *
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
364 PyObject_Repr(PyObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
366 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
367 if (PyErr_CheckSignals())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
368 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
369 #ifdef USE_STACKCHECK
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
370 if (PyOS_CheckStack()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
371 PyErr_SetString(PyExc_MemoryError, "stack overflow");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
372 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
373 }
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
374 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
375 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
376 return PyUnicode_FromString("<NULL>");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
377 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
378 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
379 v->ob_type->tp_name, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
380 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
381 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
382 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
383 if (!PyUnicode_Check(res)) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
384 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
385 "__repr__ returned non-string (type %.200s)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
386 res->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
387 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
388 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
389 }
73799
c5d2ce38b0d3 PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73669
diff changeset
390 #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
391 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
392 return NULL;
c5d2ce38b0d3 PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73669
diff changeset
393 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
394 return res;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5006
diff changeset
397 PyObject *
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
398 PyObject_Str(PyObject *v)
1400
aac8231a715c * mpzmodule.c: removed redundant mpz_print function.
Guido van Rossum <guido@python.org>
parents: 1361
diff changeset
399 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
400 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
401 if (PyErr_CheckSignals())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
402 return NULL;
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
403 #ifdef USE_STACKCHECK
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
404 if (PyOS_CheckStack()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
405 PyErr_SetString(PyExc_MemoryError, "stack overflow");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
406 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
407 }
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
408 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
409 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
410 return PyUnicode_FromString("<NULL>");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
411 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
412 #ifndef Py_DEBUG
73643
701165dfaae5 PyObject_Str() ensures that the result string is ready
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73457
diff changeset
413 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
414 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
415 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
416 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
417 return v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
418 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
419 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
420 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
421
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
422 /* 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
423 infinitely. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
424 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
425 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
426 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
427 Py_LeaveRecursiveCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
428 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
429 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
430 if (!PyUnicode_Check(res)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
431 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
432 "__str__ returned non-string (type %.200s)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
433 Py_TYPE(res)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
434 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
435 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
436 }
73799
c5d2ce38b0d3 PyObject_Repr() ensures that the result is a ready Unicode string
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73669
diff changeset
437 #ifndef Py_DEBUG
73643
701165dfaae5 PyObject_Str() ensures that the result string is ready
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73457
diff changeset
438 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
439 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
440 #endif
73643
701165dfaae5 PyObject_Str() ensures that the result string is ready
Victor Stinner <victor.stinner@haypocalc.com>
parents: 73457
diff changeset
441 assert(_PyUnicode_CheckConsistency(res, 1));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
442 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
443 }
ef11cbc08dab Change the %s format specifier for str objects so that it returns a
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 34931
diff changeset
444
47611
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47301
diff changeset
445 PyObject *
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47301
diff changeset
446 PyObject_ASCII(PyObject *v)
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47301
diff changeset
447 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
448 PyObject *repr, *ascii, *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
449
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
450 repr = PyObject_Repr(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
451 if (repr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
452 return NULL;
47611
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47301
diff changeset
453
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
454 /* 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
455 ascii = _PyUnicode_AsASCIIString(repr, "backslashreplace");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
456 Py_DECREF(repr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
457 if (ascii == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
458 return NULL;
47611
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47301
diff changeset
459
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
460 res = PyUnicode_DecodeASCII(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
461 PyBytes_AS_STRING(ascii),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
462 PyBytes_GET_SIZE(ascii),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
463 NULL);
47611
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47301
diff changeset
464
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
465 Py_DECREF(ascii);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
466 return res;
47611
da47e7e135ae #2630: Implement PEP 3138.
Georg Brandl <georg@python.org>
parents: 47301
diff changeset
467 }
16001
f3740674ac5b Changes to recursive-object comparisons, having to do with a test case
Guido van Rossum <guido@python.org>
parents: 15962
diff changeset
468
48871
548dccc4008e make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
469 PyObject *
548dccc4008e make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
470 PyObject_Bytes(PyObject *v)
548dccc4008e make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
471 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
472 PyObject *result, *func;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74416
diff changeset
473 _Py_IDENTIFIER(__bytes__);
48871
548dccc4008e make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
474
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
475 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
476 return PyBytes_FromString("<NULL>");
48871
548dccc4008e make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
477
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
478 if (PyBytes_CheckExact(v)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
479 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
480 return v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
481 }
48871
548dccc4008e make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
482
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74416
diff changeset
483 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
484 if (func != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
485 result = PyObject_CallFunctionObjArgs(func, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
486 Py_DECREF(func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
487 if (result == NULL)
64654
17a8f704f07d Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64299
diff changeset
488 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
489 if (!PyBytes_Check(result)) {
64654
17a8f704f07d Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64299
diff changeset
490 PyErr_Format(PyExc_TypeError,
17a8f704f07d Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64299
diff changeset
491 "__bytes__ returned non-bytes (type %.200s)",
17a8f704f07d Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64299
diff changeset
492 Py_TYPE(result)->tp_name);
17a8f704f07d Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64299
diff changeset
493 Py_DECREF(result);
17a8f704f07d Merged revisions 84717 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 64299
diff changeset
494 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
495 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
496 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
497 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
498 else if (PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
499 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
500 return PyBytes_FromObject(v);
48871
548dccc4008e make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
501 }
548dccc4008e make bytes(o) respect __bytes__ #2415
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
502
51247
ba94d7c095e8 Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents: 51245
diff changeset
503 /* 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
504 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
505 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
506 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
507 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
508
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
509 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
510
51247
ba94d7c095e8 Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents: 51245
diff changeset
511 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
512 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
513 coercion.
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
514
51247
ba94d7c095e8 Issue #1717, continued: remove PyObject_Compare and Py_CmpToRich declarations
Mark Dickinson <dickinsm@gmail.com>
parents: 51245
diff changeset
515 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
516
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
517 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
518 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
519 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
520 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
521
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
522 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
523 NotImplemented.
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
524
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
525 (*) Practical amendments:
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
526
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
527 - 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
528 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
529 implementation).
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
530
23598
2b1d61781d63 Implement the intention of SF patch 472523 (but coded differently).
Guido van Rossum <guido@python.org>
parents: 23542
diff changeset
531 */
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
532
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
533 /* 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
534 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
535
40485
d4fcb5656316 The opstrings table was backwards. Add an XXX comment.
Guido van Rossum <guido@python.org>
parents: 40401
diff changeset
536 static char *opstrings[] = {"<", "<=", "==", "!=", ">", ">="};
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
537
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
538 /* 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
539 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
540 static PyObject *
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
541 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
542 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
543 richcmpfunc f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
544 PyObject *res;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
545 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
546
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
547 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
548 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
549 (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
550 checked_reverse_op = 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
551 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
552 if (res != Py_NotImplemented)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
553 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
554 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
555 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
556 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
557 res = (*f)(v, w, op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
558 if (res != Py_NotImplemented)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
559 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
560 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
561 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
562 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
563 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
564 if (res != Py_NotImplemented)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
565 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
566 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
567 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
568 /* 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
569 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
570 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
571 case Py_EQ:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
572 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
573 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
574 case Py_NE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
575 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
576 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
577 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
578 /* 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
579 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
580 "unorderable types: %.100s() %s %.100s()",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
581 v->ob_type->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
582 opstrings[op],
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
583 w->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
584 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
585 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
586 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
587 return res;
15941
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
588 }
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
589
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
590 /* 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
591 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
592
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
593 PyObject *
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
594 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
595 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
596 PyObject *res;
15941
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
597
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
598 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
599 if (v == NULL || w == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
600 if (!PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
601 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
602 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
603 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
604 if (Py_EnterRecursiveCall(" in comparison"))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
605 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
606 res = do_richcompare(v, w, op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
607 Py_LeaveRecursiveCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
608 return res;
15941
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
609 }
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
610
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
611 /* 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
612 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
613 int
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
614 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
615 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
616 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
617 int ok;
15941
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
618
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
619 /* 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
620 Guarantees that identity implies equality. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
621 if (v == w) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
622 if (op == Py_EQ)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
623 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
624 else if (op == Py_NE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
625 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
626 }
49721
98628dc730da Issue #4296: Fix PyObject_RichCompareBool so that "x in [x]" evaluates to
Mark Dickinson <dickinsm@gmail.com>
parents: 48885
diff changeset
627
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
628 res = PyObject_RichCompare(v, w, op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
629 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
630 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
631 if (PyBool_Check(res))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
632 ok = (res == Py_True);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
633 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
634 ok = PyObject_IsTrue(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
635 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
636 return ok;
15941
5abae795742e Rich comparisons. Refactored internal routine do_cmp() and added APIs
Guido van Rossum <guido@python.org>
parents: 15726
diff changeset
637 }
13141
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
638
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
639 /* Set of hash utility functions to help maintaining the invariant that
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
640 if a==b then hash(a)==hash(b)
13141
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
641
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
642 All the utility functions (_Py_Hash*()) return "-1" to signify an error.
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
643 */
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
644
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
645 /* For numeric types, the hash of a number x is based on the reduction
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
646 of x modulo the prime P = 2**_PyHASH_BITS - 1. It's designed so that
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
647 hash(x) == hash(y) whenever x and y are numerically equal, even if
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
648 x and y have different types.
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
649
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
650 A quick summary of the hashing strategy:
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
651
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
652 (1) First define the 'reduction of x modulo P' for any rational
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
653 number x; this is a standard extension of the usual notion of
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
654 reduction modulo P for integers. If x == p/q (written in lowest
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
655 terms), the reduction is interpreted as the reduction of p times
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
656 the inverse of the reduction of q, all modulo P; if q is exactly
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
657 divisible by P then define the reduction to be infinity. So we've
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
658 got a well-defined map
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
659
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
660 reduce : { rational numbers } -> { 0, 1, 2, ..., P-1, infinity }.
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
661
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
662 (2) Now for a rational number x, define hash(x) by:
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
663
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
664 reduce(x) if x >= 0
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
665 -reduce(-x) if x < 0
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
666
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
667 If the result of the reduction is infinity (this is impossible for
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
668 integers, floats and Decimals) then use the predefined hash value
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
669 _PyHASH_INF for x >= 0, or -_PyHASH_INF for x < 0, instead.
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
670 _PyHASH_INF, -_PyHASH_INF and _PyHASH_NAN are also used for the
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
671 hashes of float and Decimal infinities and nans.
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
672
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
673 A selling point for the above strategy is that it makes it possible
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
674 to compute hashes of decimal and binary floating-point numbers
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
675 efficiently, even if the exponent of the binary or decimal number
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
676 is large. The key point is that
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
677
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
678 reduce(x * y) == reduce(x) * reduce(y) (modulo _PyHASH_MODULUS)
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
679
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
680 provided that {reduce(x), reduce(y)} != {0, infinity}. The reduction of a
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
681 binary or decimal float is never infinity, since the denominator is a power
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
682 of 2 (for binary) or a divisor of a power of 10 (for decimal). So we have,
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
683 for nonnegative x,
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
684
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
685 reduce(x * 2**e) == reduce(x) * reduce(2**e) % _PyHASH_MODULUS
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
686
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
687 reduce(x * 10**e) == reduce(x) * reduce(10**e) % _PyHASH_MODULUS
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
688
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
689 and reduce(10**e) can be computed efficiently by the usual modular
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
690 exponentiation algorithm. For reduce(2**e) it's even better: since
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
691 P is of the form 2**n-1, reduce(2**e) is 2**(e mod n), and multiplication
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
692 by 2**(e mod n) modulo 2**n-1 just amounts to a rotation of bits.
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
693
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
694 */
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
695
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65348
diff changeset
696 Py_hash_t
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
697 _Py_HashDouble(double v)
13141
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
698 {
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
699 int e, sign;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
700 double m;
65603
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
701 Py_uhash_t x, y;
13976
5ada9fa54801 Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents: 13915
diff changeset
702
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
703 if (!Py_IS_FINITE(v)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
704 if (Py_IS_INFINITY(v))
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
705 return v > 0 ? _PyHASH_INF : -_PyHASH_INF;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
706 else
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
707 return _PyHASH_NAN;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
708 }
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
709
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
710 m = frexp(v, &e);
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
711
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
712 sign = 1;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
713 if (m < 0) {
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
714 sign = -1;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
715 m = -m;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
716 }
13976
5ada9fa54801 Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents: 13915
diff changeset
717
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
718 /* process 28 bits at a time; this should work well both for binary
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
719 and hexadecimal floating point. */
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
720 x = 0;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
721 while (m) {
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
722 x = ((x << 28) & _PyHASH_MODULUS) | x >> (_PyHASH_BITS - 28);
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
723 m *= 268435456.0; /* 2**28 */
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
724 e -= 28;
65603
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
725 y = (Py_uhash_t)m; /* pull out integer part */
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
726 m -= y;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
727 x += y;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
728 if (x >= _PyHASH_MODULUS)
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
729 x -= _PyHASH_MODULUS;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
730 }
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
731
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
732 /* adjust for the exponent; first reduce it modulo _PyHASH_BITS */
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
733 e = e >= 0 ? e % _PyHASH_BITS : _PyHASH_BITS-1-((-1-e) % _PyHASH_BITS);
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
734 x = ((x << e) & _PyHASH_MODULUS) | x >> (_PyHASH_BITS - e);
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
735
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61858
diff changeset
736 x = x * sign;
65603
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
737 if (x == (Py_uhash_t)-1)
be8ae6b17539 follow up to #9778: define and use an unsigned hash type
Benjamin Peterson <benjamin@python.org>
parents: 65494
diff changeset
738 x = (Py_uhash_t)-2;
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65348
diff changeset
739 return (Py_hash_t)x;
13141
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
740 }
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 _Py_HashPointer(void *p)
13141
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
744 {
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65348
diff changeset
745 Py_hash_t x;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
746 size_t y = (size_t)p;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
747 /* bottom 3 or 4 bits are likely to be 0; rotate y by 4 to avoid
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
748 excessive hash collisions for dicts and sets */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60381
diff changeset
749 y = (y >> 4) | (y << (8 * SIZEOF_VOID_P - 4));
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65348
diff changeset
750 x = (Py_hash_t)y;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
751 if (x == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
752 x = -2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
753 return x;
13141
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
754 }
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
755
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65348
diff changeset
756 Py_hash_t
73669
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
757 _Py_HashBytes(unsigned char *p, Py_ssize_t len)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
758 {
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
759 Py_uhash_t x;
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
760 Py_ssize_t i;
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
761
75097
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
762 /*
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
763 We make the hash of the empty string be 0, rather than using
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
764 (prefix ^ suffix), since this slightly obfuscates the hash secret
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
765 */
76193
c20f604a2da6 merge 3.2 (#14509)
Benjamin Peterson <benjamin@python.org>
parents: 76105
diff changeset
766 #ifdef Py_DEBUG
75129
e0d451e24c43 merge 3.2
Benjamin Peterson <benjamin@python.org>
parents: 75097
diff changeset
767 assert(_Py_HashSecret_Initialized);
76193
c20f604a2da6 merge 3.2 (#14509)
Benjamin Peterson <benjamin@python.org>
parents: 76105
diff changeset
768 #endif
75097
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
769 if (len == 0) {
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
770 return 0;
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
771 }
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
772 x = (Py_uhash_t) _Py_HashSecret.prefix;
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
773 x ^= (Py_uhash_t) *p << 7;
73669
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
774 for (i = 0; i < len; i++)
74416
40e1be1e0707 Consolidate the occurrances of the prime used as the multiplier when hashing.
Gregory P. Smith <greg@krypto.org>
parents: 73984
diff changeset
775 x = (_PyHASH_MULTIPLIER * x) ^ (Py_uhash_t) *p++;
73669
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
776 x ^= (Py_uhash_t) len;
75097
ed76dc34b39d Merge 3.2: Issue #13703 plus some related test suite fixes.
Georg Brandl <georg@python.org>
parents: 75050 75073
diff changeset
777 x ^= (Py_uhash_t) _Py_HashSecret.suffix;
73669
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
778 if (x == -1)
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
779 x = -2;
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
780 return x;
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
781 }
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
782
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73643
diff changeset
783 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
784 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
785 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
786 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
787 Py_TYPE(v)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
788 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
789 }
13141
cca84745da3e This patch addresses two main issues: (1) There exist some non-fatal
Fred Drake <fdrake@acm.org>
parents: 13089
diff changeset
790
75066
f4b7ecf8a5f8 Issue #13703: add a way to randomize the hash values of basic types (str, bytes, datetime)
Georg Brandl <georg@python.org>
parents: 70311
diff changeset
791 _Py_HashSecret_t _Py_HashSecret;
f4b7ecf8a5f8 Issue #13703: add a way to randomize the hash values of basic types (str, bytes, datetime)
Georg Brandl <georg@python.org>
parents: 70311
diff changeset
792
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 65348
diff changeset
793 Py_hash_t
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
794 PyObject_Hash(PyObject *v)
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
795 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
796 PyTypeObject *tp = Py_TYPE(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
797 if (tp->tp_hash != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
798 return (*tp->tp_hash)(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
799 /* 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
800 * 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
801 * 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
802 * 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
803 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
804 if (tp->tp_dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
805 if (PyType_Ready(tp) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
806 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
807 if (tp->tp_hash != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
808 return (*tp->tp_hash)(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
809 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
810 /* 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
811 return PyObject_HashNotImplemented(v);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
812 }
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1051
diff changeset
813
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5006
diff changeset
814 PyObject *
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35331
diff changeset
815 PyObject_GetAttrString(PyObject *v, const char *name)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
816 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
817 PyObject *w, *res;
3986
9c2cbf306864 Support for tp_getattro, tp_setattro (Sjoerd)
Guido van Rossum <guido@python.org>
parents: 3770
diff changeset
818
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
819 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
820 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
821 w = PyUnicode_InternFromString(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
822 if (w == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
823 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
824 res = PyObject_GetAttr(v, w);
75866
059489cec7b9 Micro-optimize PyObject_GetAttrString()
Victor Stinner <victor.stinner@gmail.com>
parents: 75508
diff changeset
825 Py_DECREF(w);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
826 return res;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
827 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
828
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
829 int
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35331
diff changeset
830 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
831 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
832 PyObject *res = PyObject_GetAttrString(v, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
833 if (res != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
834 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
835 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
836 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
837 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
838 return 0;
1324
716be765a79b * accessobject.c (ownercheck): allow a base class access to protected
Guido van Rossum <guido@python.org>
parents: 1282
diff changeset
839 }
716be765a79b * accessobject.c (ownercheck): allow a base class access to protected
Guido van Rossum <guido@python.org>
parents: 1282
diff changeset
840
716be765a79b * accessobject.c (ownercheck): allow a base class access to protected
Guido van Rossum <guido@python.org>
parents: 1282
diff changeset
841 int
35999
9541369b0dca Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35331
diff changeset
842 PyObject_SetAttrString(PyObject *v, const char *name, PyObject *w)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
843 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
844 PyObject *s;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
845 int res;
3986
9c2cbf306864 Support for tp_getattro, tp_setattro (Sjoerd)
Guido van Rossum <guido@python.org>
parents: 3770
diff changeset
846
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
847 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
848 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
849 s = PyUnicode_InternFromString(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
850 if (s == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
851 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
852 res = PyObject_SetAttr(v, s, w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
853 Py_XDECREF(s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
854 return res;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
855 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
856
73984
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
857 int
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
858 _PyObject_IsAbstract(PyObject *obj)
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
859 {
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
860 int res;
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
861 PyObject* isabstract;
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
862 _Py_IDENTIFIER(__isabstractmethod__);
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
863
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
864 if (obj == NULL)
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
865 return 0;
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
866
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
867 isabstract = _PyObject_GetAttrId(obj, &PyId___isabstractmethod__);
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
868 if (isabstract == NULL) {
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
869 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
870 PyErr_Clear();
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
871 return 0;
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
872 }
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
873 return -1;
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
874 }
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
875 res = PyObject_IsTrue(isabstract);
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
876 Py_DECREF(isabstract);
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
877 return res;
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
878 }
e979b26a9172 improve abstract property support (closes #11610)
Benjamin Peterson <benjamin@python.org>
parents: 73804
diff changeset
879
5560
8ec298b255a2 Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents: 5535
diff changeset
880 PyObject *
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
881 _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
882 {
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
883 PyObject *result;
73457
6ae8c68eb0c1 Make _PyUnicode_FromId return borrowed references.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
884 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
885 if (!oname)
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
886 return NULL;
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
887 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
888 return result;
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
889 }
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
890
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
891 int
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
892 _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
893 {
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
894 int result;
73457
6ae8c68eb0c1 Make _PyUnicode_FromId return borrowed references.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
895 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
896 if (!oname)
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
897 return -1;
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
898 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
899 return result;
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
900 }
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
901
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
902 int
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
903 _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
904 {
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
905 int result;
73457
6ae8c68eb0c1 Make _PyUnicode_FromId return borrowed references.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
906 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
907 if (!oname)
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
908 return -1;
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
909 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
910 return result;
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
911 }
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
912
5560
8ec298b255a2 Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents: 5535
diff changeset
913 PyObject *
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
914 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
915 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
916 PyTypeObject *tp = Py_TYPE(v);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
917
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
918 if (!PyUnicode_Check(name)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
919 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
920 "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
921 name->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
922 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
923 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
924 if (tp->tp_getattro != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
925 return (*tp->tp_getattro)(v, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
926 if (tp->tp_getattr != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
927 char *name_str = _PyUnicode_AsString(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
928 if (name_str == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
929 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
930 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
931 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
932 PyErr_Format(PyExc_AttributeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
933 "'%.50s' object has no attribute '%U'",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
934 tp->tp_name, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
935 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
936 }
8ec298b255a2 Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents: 5535
diff changeset
937
8ec298b255a2 Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents: 5535
diff changeset
938 int
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
939 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
940 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
941 PyObject *res = PyObject_GetAttr(v, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
942 if (res != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
943 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
944 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
945 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
946 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
947 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
948 }
8ec298b255a2 Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents: 5535
diff changeset
949
8ec298b255a2 Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents: 5535
diff changeset
950 int
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
951 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
952 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
953 PyTypeObject *tp = Py_TYPE(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
954 int err;
14660
983502b2cd43 PyObject_SetAttr() and PyObject_GetAttr() now also accept Unicode
Marc-André Lemburg <mal@egenix.com>
parents: 14375
diff changeset
955
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
956 if (!PyUnicode_Check(name)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
957 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
958 "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
959 name->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
960 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
961 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
962 Py_INCREF(name);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
963
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
964 PyUnicode_InternInPlace(&name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
965 if (tp->tp_setattro != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
966 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
967 Py_DECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
968 return err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
969 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
970 if (tp->tp_setattr != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
971 char *name_str = _PyUnicode_AsString(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
972 if (name_str == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
973 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
974 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
975 Py_DECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
976 return err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
977 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
978 Py_DECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
979 assert(name->ob_refcnt >= 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
980 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
981 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
982 "'%.100s' object has no attributes "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
983 "(%s .%U)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
984 tp->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
985 value==NULL ? "del" : "assign to",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
986 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
987 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
988 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
989 "'%.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
990 "(%s .%U)",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
991 tp->tp_name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
992 value==NULL ? "del" : "assign to",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
993 name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
994 return -1;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
995 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
996
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
997 /* 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
998
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
999 PyObject **
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1000 _PyObject_GetDictPtr(PyObject *obj)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1001 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1002 Py_ssize_t dictoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1003 PyTypeObject *tp = Py_TYPE(obj);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1004
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1005 dictoffset = tp->tp_dictoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1006 if (dictoffset == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1007 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1008 if (dictoffset < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1009 Py_ssize_t tsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1010 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
1011
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1012 tsize = ((PyVarObject *)obj)->ob_size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1013 if (tsize < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1014 tsize = -tsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1015 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
1016
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1017 dictoffset += (long)size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1018 assert(dictoffset > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1019 assert(dictoffset % SIZEOF_VOID_P == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1020 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1021 return (PyObject **) ((char *)obj + dictoffset);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1022 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1023
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1024 PyObject *
28320
fd5ef7003469 Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents: 28308
diff changeset
1025 PyObject_SelfIter(PyObject *obj)
28308
9c3572a5575f Created PyObject_GenericGetIter().
Raymond Hettinger <python@rcn.com>
parents: 27966
diff changeset
1026 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1027 Py_INCREF(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1028 return obj;
28308
9c3572a5575f Created PyObject_GenericGetIter().
Raymond Hettinger <python@rcn.com>
parents: 27966
diff changeset
1029 }
9c3572a5575f Created PyObject_GenericGetIter().
Raymond Hettinger <python@rcn.com>
parents: 27966
diff changeset
1030
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
1031 /* 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
1032 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
1033 _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
1034 {
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
1035 PyObject *mod, *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
1036 mod = PyImport_ImportModule("builtins");
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
1037 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
1038 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
1039 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
1040 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
1041 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
1042 }
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
1043
50755
c99ce0164699 Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 50735
diff changeset
1044 /* 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
1045 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
1046 on every iteration.
c99ce0164699 Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 50735
diff changeset
1047 */
c99ce0164699 Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 50735
diff changeset
1048
c99ce0164699 Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 50735
diff changeset
1049 PyObject *
c99ce0164699 Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 50735
diff changeset
1050 _PyObject_NextNotImplemented(PyObject *self)
c99ce0164699 Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 50735
diff changeset
1051 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1052 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1053 "'%.200s' object is not iterable",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1054 Py_TYPE(self)->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1055 return NULL;
50755
c99ce0164699 Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 50735
diff changeset
1056 }
c99ce0164699 Merged revisions 68560 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 50735
diff changeset
1057
33489
4cb1016525b7 Move a comment back to its rightful location.
Michael W. Hudson <mwh@python.net>
parents: 32981
diff changeset
1058 /* 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
1059
28308
9c3572a5575f Created PyObject_GenericGetIter().
Raymond Hettinger <python@rcn.com>
parents: 27966
diff changeset
1060 PyObject *
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1061 _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
1062 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1063 PyTypeObject *tp = Py_TYPE(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1064 PyObject *descr = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1065 PyObject *res = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1066 descrgetfunc f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1067 Py_ssize_t dictoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1068 PyObject **dictptr;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1069
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1070 if (!PyUnicode_Check(name)){
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1071 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1072 "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
1073 name->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1074 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1075 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1076 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1077 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
1078
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1079 if (tp->tp_dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1080 if (PyType_Ready(tp) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1081 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1082 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1083
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1084 descr = _PyType_Lookup(tp, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1085 Py_XINCREF(descr);
30159
941d49a65f06 Fix for
Michael W. Hudson <mwh@python.net>
parents: 28669
diff changeset
1086
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1087 f = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1088 if (descr != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1089 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
1090 if (f != NULL && PyDescr_IsData(descr)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1091 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
1092 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1093 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1094 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1095
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1096 if (dict == NULL) {
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1097 /* Inline _PyObject_GetDictPtr */
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1098 dictoffset = tp->tp_dictoffset;
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1099 if (dictoffset != 0) {
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1100 if (dictoffset < 0) {
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1101 Py_ssize_t tsize;
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1102 size_t size;
24894
8862bc59685a Inline call to _PyObject_GetDictPtr() in PyObject_GenericGetAttr().
Guido van Rossum <guido@python.org>
parents: 24644
diff changeset
1103
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1104 tsize = ((PyVarObject *)obj)->ob_size;
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1105 if (tsize < 0)
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1106 tsize = -tsize;
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1107 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
1108
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1109 dictoffset += (long)size;
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1110 assert(dictoffset > 0);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1111 assert(dictoffset % SIZEOF_VOID_P == 0);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1112 }
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1113 dictptr = (PyObject **) ((char *)obj + dictoffset);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1114 dict = *dictptr;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1115 }
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1116 }
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1117 if (dict != NULL) {
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1118 Py_INCREF(dict);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1119 res = PyDict_GetItem(dict, name);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1120 if (res != NULL) {
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1121 Py_INCREF(res);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1122 Py_DECREF(dict);
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1123 goto done;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1124 }
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1125 Py_DECREF(dict);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1126 }
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 if (f != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1129 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
1130 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1131 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1132
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1133 if (descr != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1134 res = descr;
75498
579f845ac396 Issue #14211: _PyObject_GenericSetAttrWithDict() keeps a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75254
diff changeset
1135 descr = NULL;
61467
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 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1138
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1139 PyErr_Format(PyExc_AttributeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1140 "'%.50s' object has no attribute '%U'",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1141 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
1142 done:
75498
579f845ac396 Issue #14211: _PyObject_GenericSetAttrWithDict() keeps a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75254
diff changeset
1143 Py_XDECREF(descr);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1144 Py_DECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1145 return res;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1146 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1147
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1148 PyObject *
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1149 PyObject_GenericGetAttr(PyObject *obj, PyObject *name)
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1150 {
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1151 return _PyObject_GenericGetAttrWithDict(obj, name, NULL);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1152 }
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1153
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1154 int
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1155 _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1156 PyObject *value, PyObject *dict)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1157 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1158 PyTypeObject *tp = Py_TYPE(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1159 PyObject *descr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1160 descrsetfunc f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1161 PyObject **dictptr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1162 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
1163
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1164 if (!PyUnicode_Check(name)){
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1165 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1166 "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
1167 name->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1168 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1169 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1170
75508
46e600fa8d05 refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents: 75498
diff changeset
1171 if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
46e600fa8d05 refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents: 75498
diff changeset
1172 return -1;
46e600fa8d05 refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents: 75498
diff changeset
1173
46e600fa8d05 refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents: 75498
diff changeset
1174 Py_INCREF(name);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1175
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1176 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
1177 Py_XINCREF(descr);
579f845ac396 Issue #14211: _PyObject_GenericSetAttrWithDict() keeps a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75254
diff changeset
1178
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1179 f = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1180 if (descr != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1181 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
1182 if (f != NULL && PyDescr_IsData(descr)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1183 res = f(descr, obj, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1184 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1185 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1186 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1187
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1188 if (dict == NULL) {
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1189 dictptr = _PyObject_GetDictPtr(obj);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1190 if (dictptr != NULL) {
76485
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76193
diff changeset
1191 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
1192 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
1193 PyErr_SetObject(PyExc_AttributeError, name);
6e5855854a2e Implement PEP 412: Key-sharing dictionaries (closes #13903)
Benjamin Peterson <benjamin@python.org>
parents: 76193
diff changeset
1194 goto done;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1195 }
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1196 }
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1197 if (dict != NULL) {
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1198 Py_INCREF(dict);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1199 if (value == NULL)
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1200 res = PyDict_DelItem(dict, name);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1201 else
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1202 res = PyDict_SetItem(dict, name, value);
75508
46e600fa8d05 refactor and avoid warnings
Benjamin Peterson <benjamin@python.org>
parents: 75498
diff changeset
1203 Py_DECREF(dict);
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1204 if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1205 PyErr_SetObject(PyExc_AttributeError, name);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1206 goto done;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1207 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1208
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1209 if (f != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1210 res = f(descr, obj, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1211 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1212 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1213
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1214 if (descr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1215 PyErr_Format(PyExc_AttributeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1216 "'%.100s' object has no attribute '%U'",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1217 tp->tp_name, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1218 goto done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1219 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18887
diff changeset
1220
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1221 PyErr_Format(PyExc_AttributeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1222 "'%.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
1223 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
1224 done:
75498
579f845ac396 Issue #14211: _PyObject_GenericSetAttrWithDict() keeps a strong reference to
Victor Stinner <victor.stinner@gmail.com>
parents: 75254
diff changeset
1225 Py_XDECREF(descr);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1226 Py_DECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1227 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
1228 }
8ec298b255a2 Moved PyObject_{Get,Set}Attr here (from dictobject) and add PyObject_HasAttr.
Guido van Rossum <guido@python.org>
parents: 5535
diff changeset
1229
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1230 int
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1231 PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value)
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1232 {
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1233 return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL);
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1234 }
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1235
75050
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1236 int
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1237 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
1238 {
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1239 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
1240 if (dictptr == NULL) {
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1241 PyErr_SetString(PyExc_AttributeError,
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1242 "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
1243 return -1;
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1244 }
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1245 if (value == NULL) {
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1246 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
1247 return -1;
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1248 }
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1249 if (!PyDict_Check(value)) {
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1250 PyErr_Format(PyExc_TypeError,
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1251 "__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
1252 "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
1253 return -1;
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1254 }
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1255 dict = *dictptr;
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1256 Py_XINCREF(value);
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1257 *dictptr = value;
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1258 Py_XDECREF(dict);
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1259 return 0;
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1260 }
78f93eb7dd75 add generic implementation of a __dict__ descriptor for C types
Benjamin Peterson <benjamin@python.org>
parents: 74578
diff changeset
1261
64299
4c978cd3640f Merged revisions 84344 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63247
diff changeset
1262
1282
e0464e7115ca * pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1263 /* 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
1264 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
1265
e0464e7115ca * pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1266 int
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1267 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
1268 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1269 Py_ssize_t res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1270 if (v == Py_True)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1271 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1272 if (v == Py_False)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1273 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1274 if (v == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1275 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1276 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
1277 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
1278 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
1279 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
1280 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
1281 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
1282 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
1283 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
1284 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
1285 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1286 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1287 /* 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
1288 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
1289 }
e0464e7115ca * pythonrun.c: Print exception type+arg *after* stack trace instead of
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1290
24122
d332484e394a Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents: 24121
diff changeset
1291 /* equivalent of 'not v'
7935
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1292 Return -1 if an error occurred */
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1293
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1294 int
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1295 PyObject_Not(PyObject *v)
7935
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1296 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1297 int res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1298 res = PyObject_IsTrue(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1299 if (res < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1300 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1301 return res == 0;
7935
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1302 }
aa7d69d67c81 Add PyObject_Not().
Guido van Rossum <guido@python.org>
parents: 7119
diff changeset
1303
2237
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1304 /* Test whether an object can be called */
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1305
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1306 int
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1307 PyCallable_Check(PyObject *x)
2237
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1308 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1309 if (x == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1310 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1311 return x->ob_type->tp_call != NULL;
2237
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1312 }
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1313
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
1314
41107
cf452027073e Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents: 40737
diff changeset
1315 /* 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
1316 static PyObject *
41450
d1c3dd184e38 Rough and dirty job -- allow concatenation of bytes and arbitrary
Guido van Rossum <guido@python.org>
parents: 41124
diff changeset
1317 _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
1318 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1319 PyObject *names;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1320 PyObject *locals = PyEval_GetLocals();
19932
621ed13445de PyObject_Dir(): Merge in __members__ and __methods__ too (if they exist,
Tim Peters <tim.peters@gmail.com>
parents: 19931
diff changeset
1321
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1322 if (locals == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1323 PyErr_SetString(PyExc_SystemError, "frame does not exist");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1324 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1325 }
19932
621ed13445de PyObject_Dir(): Merge in __members__ and __methods__ too (if they exist,
Tim Peters <tim.peters@gmail.com>
parents: 19931
diff changeset
1326
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1327 names = PyMapping_Keys(locals);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1328 if (!names)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1329 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1330 if (!PyList_Check(names)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1331 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1332 "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
1333 "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
1334 Py_DECREF(names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1335 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1336 }
70801
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1337 if (PyList_Sort(names)) {
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1338 Py_DECREF(names);
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1339 return NULL;
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1340 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1341 /* 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
1342 return names;
41107
cf452027073e Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents: 40737
diff changeset
1343 }
cf452027073e Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents: 40737
diff changeset
1344
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 70314
diff changeset
1345 /* 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
1346 static PyObject *
cf452027073e Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents: 40737
diff changeset
1347 _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
1348 {
70801
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1349 PyObject *result, *sorted;
74578
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74416
diff changeset
1350 _Py_IDENTIFIER(__dir__);
7d96679c5d46 use the static identifier api for looking up special methods
Benjamin Peterson <benjamin@python.org>
parents: 74416
diff changeset
1351 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
1352
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1353 assert(obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1354 if (dirfunc == NULL) {
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 70314
diff changeset
1355 if (!PyErr_Occurred())
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 70314
diff changeset
1356 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
1357 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1358 }
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 70314
diff changeset
1359 /* use __dir__ */
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 70314
diff changeset
1360 result = PyObject_CallFunctionObjArgs(dirfunc, NULL);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 70314
diff changeset
1361 Py_DECREF(dirfunc);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 70314
diff changeset
1362 if (result == NULL)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 70314
diff changeset
1363 return NULL;
70801
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1364 /* return sorted(result) */
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1365 sorted = PySequence_List(result);
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1366 Py_DECREF(result);
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1367 if (sorted == NULL)
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1368 return NULL;
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1369 if (PyList_Sort(sorted)) {
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1370 Py_DECREF(sorted);
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1371 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1372 }
70801
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1373 return sorted;
41107
cf452027073e Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents: 40737
diff changeset
1374 }
cf452027073e Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents: 40737
diff changeset
1375
cf452027073e Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents: 40737
diff changeset
1376 /* 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
1377 (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
1378 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
1379 */
cf452027073e Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents: 40737
diff changeset
1380 PyObject *
cf452027073e Patch #1591665: implement the __dir__() special function lookup in PyObject_Dir.
Georg Brandl <georg@python.org>
parents: 40737
diff changeset
1381 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
1382 {
70801
f74fceebf853 allow __dir__ to return any sequence
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
1383 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
1384 }
2237
0b0b18d655d2 move callable() here
Guido van Rossum <guido@python.org>
parents: 2160
diff changeset
1385
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1386 /*
71542
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1387 None is a non-NULL undefined value.
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1388 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
1389 so there is exactly one (which is indestructible, by the way).
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1390 */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1391
739
ab1b3486b226 Fix lint bug
Guido van Rossum <guido@python.org>
parents: 512
diff changeset
1392 /* ARGSUSED */
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5006
diff changeset
1393 static PyObject *
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1394 none_repr(PyObject *op)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
1395 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1396 return PyUnicode_FromString("None");
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1397 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1398
16165
0a72070eab6e A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents: 16123
diff changeset
1399 /* ARGUSED */
0a72070eab6e A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents: 16123
diff changeset
1400 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
1401 none_dealloc(PyObject* ignore)
16165
0a72070eab6e A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents: 16123
diff changeset
1402 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1403 /* 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
1404 * 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
1405 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1406 Py_FatalError("deallocating None");
16165
0a72070eab6e A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents: 16123
diff changeset
1407 }
0a72070eab6e A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents: 16123
diff changeset
1408
71614
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1409 static PyObject *
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1410 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
1411 {
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1412 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
1413 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
1414 return NULL;
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1415 }
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1416 Py_RETURN_NONE;
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1417 }
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1418
71542
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1419 static int
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1420 none_bool(PyObject *v)
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1421 {
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1422 return 0;
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1423 }
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1424
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1425 static PyNumberMethods none_as_number = {
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1426 0, /* nb_add */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1427 0, /* nb_subtract */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1428 0, /* nb_multiply */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1429 0, /* nb_remainder */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1430 0, /* nb_divmod */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1431 0, /* nb_power */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1432 0, /* nb_negative */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1433 0, /* nb_positive */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1434 0, /* nb_absolute */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1435 (inquiry)none_bool, /* nb_bool */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1436 0, /* nb_invert */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1437 0, /* nb_lshift */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1438 0, /* nb_rshift */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1439 0, /* nb_and */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1440 0, /* nb_xor */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1441 0, /* nb_or */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1442 0, /* nb_int */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1443 0, /* nb_reserved */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1444 0, /* nb_float */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1445 0, /* nb_inplace_add */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1446 0, /* nb_inplace_subtract */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1447 0, /* nb_inplace_multiply */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1448 0, /* nb_inplace_remainder */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1449 0, /* nb_inplace_power */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1450 0, /* nb_inplace_lshift */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1451 0, /* nb_inplace_rshift */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1452 0, /* nb_inplace_and */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1453 0, /* nb_inplace_xor */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1454 0, /* nb_inplace_or */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1455 0, /* nb_floor_divide */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1456 0, /* nb_true_divide */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1457 0, /* nb_inplace_floor_divide */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1458 0, /* nb_inplace_true_divide */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1459 0, /* nb_index */
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1460 };
16165
0a72070eab6e A few miscellaneous helpers.
Barry Warsaw <barry@python.org>
parents: 16123
diff changeset
1461
19294
1456ec735087 Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents: 19293
diff changeset
1462 static PyTypeObject PyNone_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1463 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1464 "NoneType",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1465 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1466 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1467 none_dealloc, /*tp_dealloc*/ /*never called*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1468 0, /*tp_print*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1469 0, /*tp_getattr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1470 0, /*tp_setattr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1471 0, /*tp_reserved*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1472 none_repr, /*tp_repr*/
71542
ccce01988603 Issue 12647: Add __bool__() method to the None object.
Raymond Hettinger <python@rcn.com>
parents: 70802
diff changeset
1473 &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
1474 0, /*tp_as_sequence*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1475 0, /*tp_as_mapping*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1476 0, /*tp_hash */
71614
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1477 0, /*tp_call */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1478 0, /*tp_str */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1479 0, /*tp_getattro */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1480 0, /*tp_setattro */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1481 0, /*tp_as_buffer */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1482 Py_TPFLAGS_DEFAULT, /*tp_flags */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1483 0, /*tp_doc */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1484 0, /*tp_traverse */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1485 0, /*tp_clear */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1486 0, /*tp_richcompare */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1487 0, /*tp_weaklistoffset */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1488 0, /*tp_iter */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1489 0, /*tp_iternext */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1490 0, /*tp_methods */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1491 0, /*tp_members */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1492 0, /*tp_getset */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1493 0, /*tp_base */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1494 0, /*tp_dict */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1495 0, /*tp_descr_get */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1496 0, /*tp_descr_set */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1497 0, /*tp_dictoffset */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1498 0, /*tp_init */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1499 0, /*tp_alloc */
84c3be27b4c7 make the types of None and Ellipsis callable
Benjamin Peterson <benjamin@python.org>
parents: 71542
diff changeset
1500 none_new, /*tp_new */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1501 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1502
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5006
diff changeset
1503 PyObject _Py_NoneStruct = {
42334
e70cdce0e8b2 Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 42196
diff changeset
1504 _PyObject_EXTRA_INIT
e70cdce0e8b2 Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 42196
diff changeset
1505 1, &PyNone_Type
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1506 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1507
15726
db9f1893be01 Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
1508 /* 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
1509 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
1510
db9f1893be01 Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
1511 static PyObject *
db9f1893be01 Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
1512 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
1513 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1514 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
1515 }
db9f1893be01 Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
1516
71616
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1517 static PyObject *
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1518 notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1519 {
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1520 if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_Size(kwargs))) {
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1521 PyErr_SetString(PyExc_TypeError, "NotImplementedType takes no arguments");
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1522 return NULL;
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1523 }
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 71623
diff changeset
1524 Py_RETURN_NOTIMPLEMENTED;
71616
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1525 }
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1526
15726
db9f1893be01 Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
1527 static PyTypeObject PyNotImplemented_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1528 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1529 "NotImplementedType",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1530 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1531 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1532 none_dealloc, /*tp_dealloc*/ /*never called*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1533 0, /*tp_print*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1534 0, /*tp_getattr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1535 0, /*tp_setattr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1536 0, /*tp_reserved*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1537 NotImplemented_repr, /*tp_repr*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1538 0, /*tp_as_number*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1539 0, /*tp_as_sequence*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1540 0, /*tp_as_mapping*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1541 0, /*tp_hash */
71616
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1542 0, /*tp_call */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1543 0, /*tp_str */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1544 0, /*tp_getattro */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1545 0, /*tp_setattro */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1546 0, /*tp_as_buffer */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1547 Py_TPFLAGS_DEFAULT, /*tp_flags */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1548 0, /*tp_doc */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1549 0, /*tp_traverse */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1550 0, /*tp_clear */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1551 0, /*tp_richcompare */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1552 0, /*tp_weaklistoffset */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1553 0, /*tp_iter */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1554 0, /*tp_iternext */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1555 0, /*tp_methods */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1556 0, /*tp_members */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1557 0, /*tp_getset */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1558 0, /*tp_base */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1559 0, /*tp_dict */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1560 0, /*tp_descr_get */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1561 0, /*tp_descr_set */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1562 0, /*tp_dictoffset */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1563 0, /*tp_init */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1564 0, /*tp_alloc */
2428c239d848 also make NotImplementedType callable
Benjamin Peterson <benjamin@python.org>
parents: 71614
diff changeset
1565 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
1566 };
db9f1893be01 Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
1567
db9f1893be01 Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
1568 PyObject _Py_NotImplementedStruct = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1569 _PyObject_EXTRA_INIT
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1570 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
1571 };
db9f1893be01 Changes for PEP 208. PyObject_Compare has been rewritten. Instances no
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
1572
19294
1456ec735087 Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents: 19293
diff changeset
1573 void
1456ec735087 Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents: 19293
diff changeset
1574 _Py_ReadyTypes(void)
1456ec735087 Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents: 19293
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(&PyType_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 type type");
19294
1456ec735087 Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents: 19293
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(&_PyWeakref_RefType) < 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 weakref type");
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 32463
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(&_PyWeakref_CallableProxyType) < 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 callable weakref proxy type");
53274
8533cfc2420a Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53244
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(&_PyWeakref_ProxyType) < 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 weakref proxy type");
53274
8533cfc2420a Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53244
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(&PyBool_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 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
1590
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1591 if (PyType_Ready(&PyByteArray_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 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
1593
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1594 if (PyType_Ready(&PyBytes_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'");
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
1596
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1597 if (PyType_Ready(&PyList_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 list type");
19294
1456ec735087 Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents: 19293
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(&PyNone_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 None type");
19294
1456ec735087 Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents: 19293
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(&PyNotImplemented_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 NotImplemented type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
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(&PyTraceBack_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 traceback 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(&PySuper_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 super 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(&PyBaseObject_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 object 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(&PyRange_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 range type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
diff changeset
1617
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1618 if (PyType_Ready(&PyDict_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1619 Py_FatalError("Can't initialize dict type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
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(&PySet_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 set 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(&PyUnicode_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 str 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(&PySlice_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 slice 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(&PyStaticMethod_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 static method type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
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(&PyComplex_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 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
1635
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1636 if (PyType_Ready(&PyFloat_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 float type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
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(&PyLong_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 int type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
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(&PyFrozenSet_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 frozenset type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
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(&PyProperty_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 property type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
diff changeset
1647
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 75129
diff changeset
1648 if (PyType_Ready(&_PyManagedBuffer_Type) < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 75129
diff changeset
1649 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
1650
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1651 if (PyType_Ready(&PyMemoryView_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 memoryview type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
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(&PyTuple_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 tuple type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
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(&PyEnum_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 enumerate type");
53244
6ec3df375f5a Merged revisions 71722 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52870
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(&PyReversed_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 reversed type");
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39623
diff changeset
1662
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1663 if (PyType_Ready(&PyStdPrinter_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1664 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
1665
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1666 if (PyType_Ready(&PyCode_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 code 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(&PyFrame_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 frame type");
53274
8533cfc2420a Merged revisions 71734,71738-71739 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53244
diff changeset
1671
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1672 if (PyType_Ready(&PyCFunction_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1673 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
1674
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1675 if (PyType_Ready(&PyMethod_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1676 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
1677
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1678 if (PyType_Ready(&PyFunction_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1679 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
1680
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1681 if (PyType_Ready(&PyDictProxy_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1682 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
1683
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1684 if (PyType_Ready(&PyGen_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1685 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
1686
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1687 if (PyType_Ready(&PyGetSetDescr_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1688 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
1689
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1690 if (PyType_Ready(&PyWrapperDescr_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1691 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
1692
72165
51e27f42beda make sure to initialize the method wrapper type
Benjamin Peterson <benjamin@python.org>
parents: 71622
diff changeset
1693 if (PyType_Ready(&_PyMethodWrapper_Type) < 0)
51e27f42beda make sure to initialize the method wrapper type
Benjamin Peterson <benjamin@python.org>
parents: 71622
diff changeset
1694 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
1695
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1696 if (PyType_Ready(&PyEllipsis_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1697 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
1698
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1699 if (PyType_Ready(&PyMemberDescr_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1700 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
1701
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1702 if (PyType_Ready(&PyFilter_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1703 Py_FatalError("Can't initialize filter type");
53953
261f594014c6 these builtins have to be initialized
Benjamin Peterson <benjamin@python.org>
parents: 53906
diff changeset
1704
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1705 if (PyType_Ready(&PyMap_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1706 Py_FatalError("Can't initialize map type");
53953
261f594014c6 these builtins have to be initialized
Benjamin Peterson <benjamin@python.org>
parents: 53906
diff changeset
1707
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1708 if (PyType_Ready(&PyZip_Type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1709 Py_FatalError("Can't initialize zip type");
80072
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1710
77339
9c445f4695c1 Eric Snow's implementation of PEP 421.
Barry Warsaw <barry@python.org>
parents: 76485
diff changeset
1711 if (PyType_Ready(&_PyNamespace_Type) < 0)
9c445f4695c1 Eric Snow's implementation of PEP 421.
Barry Warsaw <barry@python.org>
parents: 76485
diff changeset
1712 Py_FatalError("Can't initialize namespace type");
80073
9371bf2287c4 merge 3.2 (#16369)
Benjamin Peterson <benjamin@python.org>
parents: 78921 80072
diff changeset
1713
80072
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1714 if (PyType_Ready(&PyCapsule_Type) < 0)
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1715 Py_FatalError("Can't initialize capsule type");
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1716
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1717 if (PyType_Ready(&PyLongRangeIter_Type) < 0)
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1718 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
1719
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1720 if (PyType_Ready(&PyCell_Type) < 0)
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1721 Py_FatalError("Can't initialize cell type");
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1722
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1723 if (PyType_Ready(&PyInstanceMethod_Type) < 0)
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1724 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
1725
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1726 if (PyType_Ready(&PyClassMethodDescr_Type) < 0)
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1727 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
1728
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1729 if (PyType_Ready(&PyMethodDescr_Type) < 0)
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1730 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
1731
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1732 if (PyType_Ready(&PyCallIter_Type) < 0)
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1733 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
1734
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1735 if (PyType_Ready(&PySeqIter_Type) < 0)
eec0cafe171d initialize more global type objects (closes #16369)
Benjamin Peterson <benjamin@python.org>
parents: 78856
diff changeset
1736 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
1737 }
1456ec735087 Add a function _Py_ReadyTypes() which initializes various and sundry
Guido van Rossum <guido@python.org>
parents: 19293
diff changeset
1738
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1739
3574
1ec154241747 TRACE_REFS -> Py_TRACE_REFS.
Guido van Rossum <guido@python.org>
parents: 3330
diff changeset
1740 #ifdef Py_TRACE_REFS
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1741
4002
4241582636ad Define reference count admin debug functions to return void.
Guido van Rossum <guido@python.org>
parents: 3986
diff changeset
1742 void
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1743 _Py_NewReference(PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1744 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1745 _Py_INC_REFTOTAL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1746 op->ob_refcnt = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1747 _Py_AddToAllObjects(op, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1748 _Py_INC_TPALLOCS(op);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1749 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1750
4002
4241582636ad Define reference count admin debug functions to return void.
Guido van Rossum <guido@python.org>
parents: 3986
diff changeset
1751 void
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1752 _Py_ForgetReference(register PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1753 {
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
1754 #ifdef SLOW_UNREF_CHECK
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1755 register 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
1756 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1757 if (op->ob_refcnt < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1758 Py_FatalError("UNREF negative refcnt");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1759 if (op == &refchain ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1760 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
1761 fprintf(stderr, "* ob\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1762 _PyObject_Dump(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1763 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
1764 _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
1765 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
1766 _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
1767 Py_FatalError("UNREF invalid object");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1768 }
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
1769 #ifdef SLOW_UNREF_CHECK
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1770 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
1771 if (p == op)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1772 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1773 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1774 if (p == &refchain) /* Not found */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1775 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
1776 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1777 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
1778 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
1779 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
1780 _Py_INC_TPFREES(op);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
1781 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
1782
4002
4241582636ad Define reference count admin debug functions to return void.
Guido van Rossum <guido@python.org>
parents: 3986
diff changeset
1783 void
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1784 _Py_Dealloc(PyObject *op)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 58
diff changeset
1785 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1786 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
1787 _Py_ForgetReference(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1788 (*dealloc)(op);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1789 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1790
28653
56006d97bcef _Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents: 28616
diff changeset
1791 /* 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
1792 * 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
1793 */
4002
4241582636ad Define reference count admin debug functions to return void.
Guido van Rossum <guido@python.org>
parents: 3986
diff changeset
1794 void
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1795 _Py_PrintReferences(FILE *fp)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1796 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1797 PyObject *op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1798 fprintf(fp, "Remaining objects:\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1799 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
1800 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
1801 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
1802 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1803 putc('\n', fp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1804 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1805 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1806
28653
56006d97bcef _Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents: 28616
diff changeset
1807 /* 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
1808 * 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
1809 */
56006d97bcef _Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents: 28616
diff changeset
1810 void
56006d97bcef _Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents: 28616
diff changeset
1811 _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
1812 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1813 PyObject *op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1814 fprintf(fp, "Remaining object addresses:\n");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1815 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
1816 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
1817 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
1818 }
56006d97bcef _Py_PrintReferences(): Changed to print object address at start of each
Tim Peters <tim.peters@gmail.com>
parents: 28616
diff changeset
1819
3024
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
1820 PyObject *
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1821 _Py_GetObjects(PyObject *self, PyObject *args)
3024
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
1822 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1823 int i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1824 PyObject *t = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1825 PyObject *res, *op;
3024
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
1826
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1827 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
1828 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1829 op = refchain._ob_next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1830 res = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1831 if (res == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1832 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1833 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
1834 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
1835 (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
1836 op = op->_ob_next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1837 if (op == &refchain)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1838 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1839 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1840 if (PyList_Append(res, op) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1841 Py_DECREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1842 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1843 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1844 op = op->_ob_next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1845 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1846 return res;
3024
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
1847 }
54aa87b1ccee Implemented two new functions in sys:
Sjoerd Mullender <sjoerd@acm.org>
parents: 2827
diff changeset
1848
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1849 #endif
3330
9f1b6e2db8e0 Hack to force loading of cobject.o
Guido van Rossum <guido@python.org>
parents: 3024
diff changeset
1850
53816
911df82bc25d add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents: 53274
diff changeset
1851 /* 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
1852 PyTypeObject *_PyCapsule_hack = &PyCapsule_Type;
911df82bc25d add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents: 53274
diff changeset
1853
911df82bc25d add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents: 53274
diff changeset
1854
3574
1ec154241747 TRACE_REFS -> Py_TRACE_REFS.
Guido van Rossum <guido@python.org>
parents: 3330
diff changeset
1855 /* 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
1856 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
1857
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1858
14006
ed369f0aa32b Updated comment
Andrew M. Kuchling <amk@amk.ca>
parents: 13976
diff changeset
1859 /* Python's malloc wrappers (see pymem.h) */
5931
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1860
13709
4e2aaf1e722a Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
1861 void *
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1862 PyMem_Malloc(size_t nbytes)
5931
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1863 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1864 return PyMem_MALLOC(nbytes);
5931
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1865 }
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1866
13709
4e2aaf1e722a Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
1867 void *
4e2aaf1e722a Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
1868 PyMem_Realloc(void *p, size_t nbytes)
5931
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1869 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1870 return PyMem_REALLOC(p, nbytes);
5931
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1871 }
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1872
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1873 void
13709
4e2aaf1e722a Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
1874 PyMem_Free(void *p)
5931
12fe5cc1516d Added _Py_ResetReferences(), if tracing references.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
1875 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1876 PyMem_FREE(p);
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
1877 }
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
1878
77577
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 77339
diff changeset
1879 void
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 77339
diff changeset
1880 _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
1881 {
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 77339
diff changeset
1882 _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
1883 _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
1884 _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
1885 _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
1886 _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
1887 _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
1888 _PySet_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
1889 _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
1890 }
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12481
diff changeset
1891
7984
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1892 /* 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
1893 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
1894 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
1895 Py_ReprLeave() to avoid infinite recursion.
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1896
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1897 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
1898 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
1899 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
1900
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1901 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
1902 */
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1903
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1904 #define KEY "Py_Repr"
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1905
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1906 int
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1907 Py_ReprEnter(PyObject *obj)
7984
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1908 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1909 PyObject *dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1910 PyObject *list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1911 Py_ssize_t i;
7984
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1912
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1913 dict = PyThreadState_GetDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1914 if (dict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1915 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1916 list = PyDict_GetItemString(dict, KEY);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1917 if (list == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1918 list = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1919 if (list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1920 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1921 if (PyDict_SetItemString(dict, KEY, list) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1922 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1923 Py_DECREF(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1924 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1925 i = PyList_GET_SIZE(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1926 while (--i >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1927 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
1928 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1929 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1930 PyList_Append(list, obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1931 return 0;
7984
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1932 }
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1933
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1934 void
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1935 Py_ReprLeave(PyObject *obj)
7984
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1936 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1937 PyObject *dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1938 PyObject *list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1939 Py_ssize_t i;
7984
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1940
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1941 dict = PyThreadState_GetDict();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1942 if (dict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1943 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1944 list = PyDict_GetItemString(dict, KEY);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1945 if (list == NULL || !PyList_Check(list))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1946 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1947 i = PyList_GET_SIZE(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1948 /* 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
1949 while (--i >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1950 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
1951 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
1952 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1953 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1954 }
7984
1d0eb2e96d76 Add implementations of Py_Repr{Enter,Leave}.
Guido van Rossum <guido@python.org>
parents: 7935
diff changeset
1955 }
11999
c94247b5c355 Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1956
24122
d332484e394a Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents: 24121
diff changeset
1957 /* Trashcan support. */
12052
5d3165e30bce Christian Tismer:
Guido van Rossum <guido@python.org>
parents: 11999
diff changeset
1958
24122
d332484e394a Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents: 24121
diff changeset
1959 /* 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
1960 int _PyTrash_delete_nesting = 0;
12481
a8898a172fe2 Christian Tismer -- total rewrite on trashcan code.
Guido van Rossum <guido@python.org>
parents: 12406
diff changeset
1961
24122
d332484e394a Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents: 24121
diff changeset
1962 /* 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
1963 * 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
1964 */
d332484e394a Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents: 24121
diff changeset
1965 PyObject *_PyTrash_delete_later = NULL;
11999
c94247b5c355 Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1966
24122
d332484e394a Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents: 24121
diff changeset
1967 /* 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
1968 * 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
1969 * 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
1970 */
11999
c94247b5c355 Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1971 void
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1972 _PyTrash_deposit_object(PyObject *op)
11999
c94247b5c355 Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1973 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1974 assert(PyObject_IS_GC(op));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1975 assert(_Py_AS_GC(op)->gc.gc_refs == _PyGC_REFS_UNTRACKED);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1976 assert(op->ob_refcnt == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1977 _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
1978 _PyTrash_delete_later = op;
11999
c94247b5c355 Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1979 }
c94247b5c355 Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1980
78856
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
1981 /* 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
1982 void
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
1983 _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
1984 {
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
1985 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
1986 assert(PyObject_IS_GC(op));
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
1987 assert(_Py_AS_GC(op)->gc.gc_refs == _PyGC_REFS_UNTRACKED);
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
1988 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
1989 _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
1990 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
1991 }
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
1992
24122
d332484e394a Trashcan cleanup: Now that cyclic gc is always there, the trashcan
Tim Peters <tim.peters@gmail.com>
parents: 24121
diff changeset
1993 /* 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
1994 * 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
1995 */
11999
c94247b5c355 Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1996 void
13473
31b1f691a7d9 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1997 _PyTrash_destroy_chain(void)
11999
c94247b5c355 Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1998 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
1999 while (_PyTrash_delete_later) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2000 PyObject *op = _PyTrash_delete_later;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2001 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
2002
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2003 _PyTrash_delete_later =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2004 (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
2005
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2006 /* 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
2007 * 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
2008 * 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
2009 * 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
2010 * up distorting allocation statistics.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2011 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2012 assert(op->ob_refcnt == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2013 ++_PyTrash_delete_nesting;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2014 (*dealloc)(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2015 --_PyTrash_delete_nesting;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59859
diff changeset
2016 }
11999
c94247b5c355 Christian Tismer's "trashcan" patch:
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
2017 }
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
2018
78856
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
2019 /* 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
2020 void
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
2021 _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
2022 {
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
2023 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
2024 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
2025 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
2026 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
2027
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
2028 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
2029 (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
2030
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
2031 /* 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
2032 * 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
2033 * 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
2034 * 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
2035 * 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
2036 */
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
2037 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
2038 ++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
2039 (*dealloc)(op);
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
2040 --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
2041 }
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
2042 }
e72cda3f40a2 Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents: 75073
diff changeset
2043
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2044 #ifndef Py_TRACE_REFS
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2045 /* 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
2046 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
2047 #undef _Py_Dealloc
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2048 PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2049 void
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2050 _Py_Dealloc(PyObject *op)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2051 {
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2052 _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
2053 (*Py_TYPE(op)->tp_dealloc)(op);
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2054 }
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2055 #endif
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66556
diff changeset
2056
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
2057 #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
2058 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36977
diff changeset
2059 #endif