annotate Objects/weakrefobject.c @ 49955:878d40468c4e legacy-trunk

Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
author Vinay Sajip <vinay_sajip@yahoo.co.uk>
date Wed, 03 Dec 2008 23:22:58 +0000
parents 73cc7b6355b8
children d5779e159ddb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
1 #include "Python.h"
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
2 #include "structmember.h"
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
3
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
4
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
5 #define GET_WEAKREFS_LISTPTR(o) \
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
6 ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
7
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
8
39351
12ffed927a3d _PyWeakref_GetWeakrefCount() now returns a Py_ssize_t instead of long.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38314
diff changeset
9 Py_ssize_t
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
10 _PyWeakref_GetWeakrefCount(PyWeakReference *head)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
11 {
39351
12ffed927a3d _PyWeakref_GetWeakrefCount() now returns a Py_ssize_t instead of long.
Neal Norwitz <nnorwitz@gmail.com>
parents: 38314
diff changeset
12 Py_ssize_t count = 0;
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
13
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
14 while (head != NULL) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
15 ++count;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
16 head = head->wr_next;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
17 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
18 return count;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
19 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
20
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
21
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
22 static void
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
23 init_weakref(PyWeakReference *self, PyObject *ob, PyObject *callback)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
24 {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
25 self->hash = -1;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
26 self->wr_object = ob;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
27 Py_XINCREF(callback);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
28 self->wr_callback = callback;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
29 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
30
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
31 static PyWeakReference *
22607
ac24c2c9bcaf Remove weakref free list. This has the side effect of fixing a memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 21483
diff changeset
32 new_weakref(PyObject *ob, PyObject *callback)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
33 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
34 PyWeakReference *result;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
35
22607
ac24c2c9bcaf Remove weakref free list. This has the side effect of fixing a memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 21483
diff changeset
36 result = PyObject_GC_New(PyWeakReference, &_PyWeakref_RefType);
ac24c2c9bcaf Remove weakref free list. This has the side effect of fixing a memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 21483
diff changeset
37 if (result) {
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
38 init_weakref(result, ob, callback);
22607
ac24c2c9bcaf Remove weakref free list. This has the side effect of fixing a memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 21483
diff changeset
39 PyObject_GC_Track(result);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
40 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
41 return result;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
42 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
43
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
44
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
45 /* This function clears the passed-in reference and removes it from the
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
46 * list of weak references for the referent. This is the only code that
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
47 * removes an item from the doubly-linked list of weak references for an
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
48 * object; it is also responsible for clearing the callback slot.
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
49 */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
50 static void
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
51 clear_weakref(PyWeakReference *self)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
52 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
53 PyObject *callback = self->wr_callback;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
54
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
55 if (PyWeakref_GET_OBJECT(self) != Py_None) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
56 PyWeakReference **list = GET_WEAKREFS_LISTPTR(
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
57 PyWeakref_GET_OBJECT(self));
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
58
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
59 if (*list == self)
40707
dbbdfc038dc9 Fix crasher for when an object's __del__ creates a new weakref to itself.
Brett Cannon <bcannon@gmail.com>
parents: 39351
diff changeset
60 /* If 'self' is the end of the list (and thus self->wr_next == NULL)
dbbdfc038dc9 Fix crasher for when an object's __del__ creates a new weakref to itself.
Brett Cannon <bcannon@gmail.com>
parents: 39351
diff changeset
61 then the weakref list itself (and thus the value of *list) will
dbbdfc038dc9 Fix crasher for when an object's __del__ creates a new weakref to itself.
Brett Cannon <bcannon@gmail.com>
parents: 39351
diff changeset
62 end up being set to NULL. */
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
63 *list = self->wr_next;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
64 self->wr_object = Py_None;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
65 if (self->wr_prev != NULL)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
66 self->wr_prev->wr_next = self->wr_next;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
67 if (self->wr_next != NULL)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
68 self->wr_next->wr_prev = self->wr_prev;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
69 self->wr_prev = NULL;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
70 self->wr_next = NULL;
30991
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
71 }
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
72 if (callback != NULL) {
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
73 Py_DECREF(callback);
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
74 self->wr_callback = NULL;
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
75 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
76 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
77
30991
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
78 /* Cyclic gc uses this to *just* clear the passed-in reference, leaving
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
79 * the callback intact and uncalled. It must be possible to call self's
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
80 * tp_dealloc() after calling this, so self has to be left in a sane enough
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
81 * state for that to work. We expect tp_dealloc to decref the callback
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
82 * then. The reason for not letting clear_weakref() decref the callback
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
83 * right now is that if the callback goes away, that may in turn trigger
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
84 * another callback (if a weak reference to the callback exists) -- running
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
85 * arbitrary Python code in the middle of gc is a disaster. The convolution
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
86 * here allows gc to delay triggering such callbacks until the world is in
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
87 * a sane state again.
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
88 */
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
89 void
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
90 _PyWeakref_ClearRef(PyWeakReference *self)
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
91 {
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
92 PyObject *callback;
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
93
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
94 assert(self != NULL);
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
95 assert(PyWeakref_Check(self));
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
96 /* Preserve and restore the callback around clear_weakref. */
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
97 callback = self->wr_callback;
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
98 self->wr_callback = NULL;
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
99 clear_weakref(self);
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
100 self->wr_callback = callback;
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
101 }
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
102
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
103 static void
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
104 weakref_dealloc(PyObject *self)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
105 {
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
106 PyObject_GC_UnTrack(self);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
107 clear_weakref((PyWeakReference *) self);
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
108 Py_TYPE(self)->tp_free(self);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
109 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
110
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
111
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
112 static int
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
113 gc_traverse(PyWeakReference *self, visitproc visit, void *arg)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
114 {
37756
7b2e436a4a21 Use Py_VISIT in all tp_traverse methods, instead of traversing manually or
Thomas Wouters <thomas@python.org>
parents: 37304
diff changeset
115 Py_VISIT(self->wr_callback);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
116 return 0;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
117 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
118
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
119
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
120 static int
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
121 gc_clear(PyWeakReference *self)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
122 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
123 clear_weakref(self);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
124 return 0;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
125 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
126
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
127
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
128 static PyObject *
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
129 weakref_call(PyWeakReference *self, PyObject *args, PyObject *kw)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
130 {
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
131 static char *kwlist[] = {NULL};
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
132
36675
dba6494735d0 Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
133 if (PyArg_ParseTupleAndKeywords(args, kw, ":__call__", kwlist)) {
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
134 PyObject *object = PyWeakref_GET_OBJECT(self);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
135 Py_INCREF(object);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
136 return (object);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
137 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
138 return NULL;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
139 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
140
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
141
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
142 static long
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
143 weakref_hash(PyWeakReference *self)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
144 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
145 if (self->hash != -1)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
146 return self->hash;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
147 if (PyWeakref_GET_OBJECT(self) == Py_None) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
148 PyErr_SetString(PyExc_TypeError, "weak object has gone away");
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
149 return -1;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
150 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
151 self->hash = PyObject_Hash(PyWeakref_GET_OBJECT(self));
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
152 return self->hash;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
153 }
30991
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
154
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
155
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
156 static PyObject *
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
157 weakref_repr(PyWeakReference *self)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
158 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
159 char buffer[256];
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
160 if (PyWeakref_GET_OBJECT(self) == Py_None) {
28644
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
161 PyOS_snprintf(buffer, sizeof(buffer), "<weakref at %p; dead>", self);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
162 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
163 else {
28644
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
164 char *name = NULL;
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
165 PyObject *nameobj = PyObject_GetAttrString(PyWeakref_GET_OBJECT(self),
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
166 "__name__");
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
167 if (nameobj == NULL)
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
168 PyErr_Clear();
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
169 else if (PyString_Check(nameobj))
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
170 name = PyString_AS_STRING(nameobj);
21083
d3b6401ca273 weakref_repr(), proxy_repr(): Conversion of sprintf() to
Barry Warsaw <barry@python.org>
parents: 21066
diff changeset
171 PyOS_snprintf(buffer, sizeof(buffer),
28644
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
172 name ? "<weakref at %p; to '%.50s' at %p (%s)>"
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
173 : "<weakref at %p; to '%.50s' at %p>",
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
174 self,
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
175 Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
28644
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
176 PyWeakref_GET_OBJECT(self),
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
177 name);
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
178 Py_XDECREF(nameobj);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
179 }
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
180 return PyString_FromString(buffer);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
181 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
182
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
183 /* Weak references only support equality, not ordering. Two weak references
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
184 are equal if the underlying objects are equal. If the underlying object has
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
185 gone away, they are equal if they are identical. */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
186
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
187 static PyObject *
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
188 weakref_richcompare(PyWeakReference* self, PyWeakReference* other, int op)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
189 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
190 if (op != Py_EQ || self->ob_type != other->ob_type) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
191 Py_INCREF(Py_NotImplemented);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
192 return Py_NotImplemented;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
193 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
194 if (PyWeakref_GET_OBJECT(self) == Py_None
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
195 || PyWeakref_GET_OBJECT(other) == Py_None) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
196 PyObject *res = self==other ? Py_True : Py_False;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
197 Py_INCREF(res);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
198 return res;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
199 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
200 return PyObject_RichCompare(PyWeakref_GET_OBJECT(self),
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
201 PyWeakref_GET_OBJECT(other), op);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
202 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
203
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
204 /* Given the head of an object's list of weak references, extract the
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
205 * two callback-less refs (ref and proxy). Used to determine if the
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
206 * shared references exist and to determine the back link for newly
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
207 * inserted references.
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
208 */
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
209 static void
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
210 get_basic_refs(PyWeakReference *head,
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
211 PyWeakReference **refp, PyWeakReference **proxyp)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
212 {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
213 *refp = NULL;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
214 *proxyp = NULL;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
215
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
216 if (head != NULL && head->wr_callback == NULL) {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
217 /* We need to be careful that the "basic refs" aren't
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
218 subclasses of the main types. That complicates this a
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
219 little. */
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
220 if (PyWeakref_CheckRefExact(head)) {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
221 *refp = head;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
222 head = head->wr_next;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
223 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
224 if (head != NULL
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
225 && head->wr_callback == NULL
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
226 && PyWeakref_CheckProxy(head)) {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
227 *proxyp = head;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
228 /* head = head->wr_next; */
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
229 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
230 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
231 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
232
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
233 /* Insert 'newref' in the list after 'prev'. Both must be non-NULL. */
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
234 static void
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
235 insert_after(PyWeakReference *newref, PyWeakReference *prev)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
236 {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
237 newref->wr_prev = prev;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
238 newref->wr_next = prev->wr_next;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
239 if (prev->wr_next != NULL)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
240 prev->wr_next->wr_prev = newref;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
241 prev->wr_next = newref;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
242 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
243
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
244 /* Insert 'newref' at the head of the list; 'list' points to the variable
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
245 * that stores the head.
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
246 */
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
247 static void
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
248 insert_head(PyWeakReference *newref, PyWeakReference **list)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
249 {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
250 PyWeakReference *next = *list;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
251
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
252 newref->wr_prev = NULL;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
253 newref->wr_next = next;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
254 if (next != NULL)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
255 next->wr_prev = newref;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
256 *list = newref;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
257 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
258
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
259 static int
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
260 parse_weakref_init_args(char *funcname, PyObject *args, PyObject *kwargs,
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
261 PyObject **obp, PyObject **callbackp)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
262 {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
263 /* XXX Should check that kwargs == NULL or is empty. */
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
264 return PyArg_UnpackTuple(args, funcname, 1, 2, obp, callbackp);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
265 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
266
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
267 static PyObject *
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
268 weakref___new__(PyTypeObject *type, PyObject *args, PyObject *kwargs)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
269 {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
270 PyWeakReference *self = NULL;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
271 PyObject *ob, *callback = NULL;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
272
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
273 if (parse_weakref_init_args("__new__", args, kwargs, &ob, &callback)) {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
274 PyWeakReference *ref, *proxy;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
275 PyWeakReference **list;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
276
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
277 if (!PyType_SUPPORTS_WEAKREFS(Py_TYPE(ob))) {
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
278 PyErr_Format(PyExc_TypeError,
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
279 "cannot create weak reference to '%s' object",
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
280 Py_TYPE(ob)->tp_name);
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
281 return NULL;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
282 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
283 if (callback == Py_None)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
284 callback = NULL;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
285 list = GET_WEAKREFS_LISTPTR(ob);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
286 get_basic_refs(*list, &ref, &proxy);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
287 if (callback == NULL && type == &_PyWeakref_RefType) {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
288 if (ref != NULL) {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
289 /* We can re-use an existing reference. */
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
290 Py_INCREF(ref);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
291 return (PyObject *)ref;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
292 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
293 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
294 /* We have to create a new reference. */
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
295 /* Note: the tp_alloc() can trigger cyclic GC, so the weakref
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
296 list on ob can be mutated. This means that the ref and
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
297 proxy pointers we got back earlier may have been collected,
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
298 so we need to compute these values again before we use
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
299 them. */
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
300 self = (PyWeakReference *) (type->tp_alloc(type, 0));
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
301 if (self != NULL) {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
302 init_weakref(self, ob, callback);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
303 if (callback == NULL && type == &_PyWeakref_RefType) {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
304 insert_head(self, list);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
305 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
306 else {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
307 PyWeakReference *prev;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
308
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
309 get_basic_refs(*list, &ref, &proxy);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
310 prev = (proxy == NULL) ? ref : proxy;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
311 if (prev == NULL)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
312 insert_head(self, list);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
313 else
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
314 insert_after(self, prev);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
315 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
316 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
317 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
318 return (PyObject *)self;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
319 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
320
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
321 static int
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
322 weakref___init__(PyObject *self, PyObject *args, PyObject *kwargs)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
323 {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
324 PyObject *tmp;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
325
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
326 if (parse_weakref_init_args("__init__", args, kwargs, &tmp, &tmp))
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
327 return 0;
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
328 else
49120
73cc7b6355b8 Fix #3634 invalid return value from _weakref.ref(Exception).__init__
Benjamin Peterson <benjamin@python.org>
parents: 47732
diff changeset
329 return -1;
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
330 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
331
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
332
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
333 PyTypeObject
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
334 _PyWeakref_RefType = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 40707
diff changeset
335 PyVarObject_HEAD_INIT(&PyType_Type, 0)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
336 "weakref",
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
337 sizeof(PyWeakReference),
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
338 0,
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
339 weakref_dealloc, /*tp_dealloc*/
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
340 0, /*tp_print*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
341 0, /*tp_getattr*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
342 0, /*tp_setattr*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
343 0, /*tp_compare*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
344 (reprfunc)weakref_repr, /*tp_repr*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
345 0, /*tp_as_number*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
346 0, /*tp_as_sequence*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
347 0, /*tp_as_mapping*/
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
348 (hashfunc)weakref_hash, /*tp_hash*/
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
349 (ternaryfunc)weakref_call, /*tp_call*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
350 0, /*tp_str*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
351 0, /*tp_getattro*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
352 0, /*tp_setattro*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
353 0, /*tp_as_buffer*/
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
354 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_RICHCOMPARE
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
355 | Py_TPFLAGS_BASETYPE, /*tp_flags*/
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
356 0, /*tp_doc*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
357 (traverseproc)gc_traverse, /*tp_traverse*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
358 (inquiry)gc_clear, /*tp_clear*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
359 (richcmpfunc)weakref_richcompare, /*tp_richcompare*/
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
360 0, /*tp_weaklistoffset*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
361 0, /*tp_iter*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
362 0, /*tp_iternext*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
363 0, /*tp_methods*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
364 0, /*tp_members*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
365 0, /*tp_getset*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
366 0, /*tp_base*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
367 0, /*tp_dict*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
368 0, /*tp_descr_get*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
369 0, /*tp_descr_set*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
370 0, /*tp_dictoffset*/
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
371 weakref___init__, /*tp_init*/
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
372 PyType_GenericAlloc, /*tp_alloc*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
373 weakref___new__, /*tp_new*/
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
374 PyObject_GC_Del, /*tp_free*/
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
375 };
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
376
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
377
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
378 static int
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
379 proxy_checkref(PyWeakReference *proxy)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
380 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
381 if (PyWeakref_GET_OBJECT(proxy) == Py_None) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
382 PyErr_SetString(PyExc_ReferenceError,
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
383 "weakly-referenced object no longer exists");
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
384 return 0;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
385 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
386 return 1;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
387 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
388
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
389
20521
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
390 /* If a parameter is a proxy, check that it is still "live" and wrap it,
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
391 * replacing the original value with the raw object. Raises ReferenceError
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
392 * if the param is a dead proxy.
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
393 */
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
394 #define UNWRAP(o) \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
395 if (PyWeakref_CheckProxy(o)) { \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
396 if (!proxy_checkref((PyWeakReference *)o)) \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
397 return NULL; \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
398 o = PyWeakref_GET_OBJECT(o); \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
399 }
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
400
21483
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
401 #define UNWRAP_I(o) \
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
402 if (PyWeakref_CheckProxy(o)) { \
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
403 if (!proxy_checkref((PyWeakReference *)o)) \
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
404 return -1; \
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
405 o = PyWeakref_GET_OBJECT(o); \
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
406 }
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
407
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
408 #define WRAP_UNARY(method, generic) \
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
409 static PyObject * \
20521
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
410 method(PyObject *proxy) { \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
411 UNWRAP(proxy); \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
412 return generic(proxy); \
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
413 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
414
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
415 #define WRAP_BINARY(method, generic) \
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
416 static PyObject * \
20521
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
417 method(PyObject *x, PyObject *y) { \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
418 UNWRAP(x); \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
419 UNWRAP(y); \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
420 return generic(x, y); \
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
421 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
422
20532
bc138bc73cdd Remove an unnecessary check for NULL.
Fred Drake <fdrake@acm.org>
parents: 20521
diff changeset
423 /* Note that the third arg needs to be checked for NULL since the tp_call
bc138bc73cdd Remove an unnecessary check for NULL.
Fred Drake <fdrake@acm.org>
parents: 20521
diff changeset
424 * slot can receive NULL for this arg.
20521
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
425 */
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
426 #define WRAP_TERNARY(method, generic) \
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
427 static PyObject * \
20521
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
428 method(PyObject *proxy, PyObject *v, PyObject *w) { \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
429 UNWRAP(proxy); \
20532
bc138bc73cdd Remove an unnecessary check for NULL.
Fred Drake <fdrake@acm.org>
parents: 20521
diff changeset
430 UNWRAP(v); \
20521
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
431 if (w != NULL) \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
432 UNWRAP(w); \
cb87bd97f740 When weakref proxies are involved in binary & ternary slot operations,
Fred Drake <fdrake@acm.org>
parents: 20280
diff changeset
433 return generic(proxy, v, w); \
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
434 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
435
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
436
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
437 /* direct slots */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
438
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
439 WRAP_BINARY(proxy_getattr, PyObject_GetAttr)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
440 WRAP_UNARY(proxy_str, PyObject_Str)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
441 WRAP_TERNARY(proxy_call, PyEval_CallObjectWithKeywords)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
442
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
443 static PyObject *
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
444 proxy_repr(PyWeakReference *proxy)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
445 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
446 char buf[160];
21083
d3b6401ca273 weakref_repr(), proxy_repr(): Conversion of sprintf() to
Barry Warsaw <barry@python.org>
parents: 21066
diff changeset
447 PyOS_snprintf(buf, sizeof(buf),
28644
8e541b078edb - The repr() of a weakref object now shows the __name__ attribute of
Guido van Rossum <guido@python.org>
parents: 24717
diff changeset
448 "<weakproxy at %p to %.100s at %p>", proxy,
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
449 Py_TYPE(PyWeakref_GET_OBJECT(proxy))->tp_name,
21083
d3b6401ca273 weakref_repr(), proxy_repr(): Conversion of sprintf() to
Barry Warsaw <barry@python.org>
parents: 21066
diff changeset
450 PyWeakref_GET_OBJECT(proxy));
47527
52294af4b663 This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents: 47294
diff changeset
451 return PyString_FromString(buf);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
452 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
453
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
454
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
455 static int
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
456 proxy_setattr(PyWeakReference *proxy, PyObject *name, PyObject *value)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
457 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
458 if (!proxy_checkref(proxy))
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
459 return -1;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
460 return PyObject_SetAttr(PyWeakref_GET_OBJECT(proxy), name, value);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
461 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
462
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
463 static int
21483
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
464 proxy_compare(PyObject *proxy, PyObject *v)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
465 {
21483
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
466 UNWRAP_I(proxy);
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
467 UNWRAP_I(v);
873291a4889e proxy_compare(): Make sure that we unwrap both objects being compared if
Fred Drake <fdrake@acm.org>
parents: 21339
diff changeset
468 return PyObject_Compare(proxy, v);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
469 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
470
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
471 /* number slots */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
472 WRAP_BINARY(proxy_add, PyNumber_Add)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
473 WRAP_BINARY(proxy_sub, PyNumber_Subtract)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
474 WRAP_BINARY(proxy_mul, PyNumber_Multiply)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
475 WRAP_BINARY(proxy_div, PyNumber_Divide)
47196
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
476 WRAP_BINARY(proxy_floor_div, PyNumber_FloorDivide)
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
477 WRAP_BINARY(proxy_true_div, PyNumber_TrueDivide)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
478 WRAP_BINARY(proxy_mod, PyNumber_Remainder)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
479 WRAP_BINARY(proxy_divmod, PyNumber_Divmod)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
480 WRAP_TERNARY(proxy_pow, PyNumber_Power)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
481 WRAP_UNARY(proxy_neg, PyNumber_Negative)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
482 WRAP_UNARY(proxy_pos, PyNumber_Positive)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
483 WRAP_UNARY(proxy_abs, PyNumber_Absolute)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
484 WRAP_UNARY(proxy_invert, PyNumber_Invert)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
485 WRAP_BINARY(proxy_lshift, PyNumber_Lshift)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
486 WRAP_BINARY(proxy_rshift, PyNumber_Rshift)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
487 WRAP_BINARY(proxy_and, PyNumber_And)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
488 WRAP_BINARY(proxy_xor, PyNumber_Xor)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
489 WRAP_BINARY(proxy_or, PyNumber_Or)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
490 WRAP_UNARY(proxy_int, PyNumber_Int)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
491 WRAP_UNARY(proxy_long, PyNumber_Long)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
492 WRAP_UNARY(proxy_float, PyNumber_Float)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
493 WRAP_BINARY(proxy_iadd, PyNumber_InPlaceAdd)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
494 WRAP_BINARY(proxy_isub, PyNumber_InPlaceSubtract)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
495 WRAP_BINARY(proxy_imul, PyNumber_InPlaceMultiply)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
496 WRAP_BINARY(proxy_idiv, PyNumber_InPlaceDivide)
47196
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
497 WRAP_BINARY(proxy_ifloor_div, PyNumber_InPlaceFloorDivide)
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
498 WRAP_BINARY(proxy_itrue_div, PyNumber_InPlaceTrueDivide)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
499 WRAP_BINARY(proxy_imod, PyNumber_InPlaceRemainder)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
500 WRAP_TERNARY(proxy_ipow, PyNumber_InPlacePower)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
501 WRAP_BINARY(proxy_ilshift, PyNumber_InPlaceLshift)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
502 WRAP_BINARY(proxy_irshift, PyNumber_InPlaceRshift)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
503 WRAP_BINARY(proxy_iand, PyNumber_InPlaceAnd)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
504 WRAP_BINARY(proxy_ixor, PyNumber_InPlaceXor)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
505 WRAP_BINARY(proxy_ior, PyNumber_InPlaceOr)
47196
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
506 WRAP_UNARY(proxy_index, PyNumber_Index)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
507
30991
14d321466a06 SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 29863
diff changeset
508 static int
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
509 proxy_nonzero(PyWeakReference *proxy)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
510 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
511 PyObject *o = PyWeakref_GET_OBJECT(proxy);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
512 if (!proxy_checkref(proxy))
32530
2451c9572edf SF bug #978308, Spurious errors taking bool of dead pro
Neal Norwitz <nnorwitz@gmail.com>
parents: 32472
diff changeset
513 return -1;
34847
51ba8ce8d92a SF bug #1770766: weakref proxy has incorrect __nonzero__ behavior.
Raymond Hettinger <python@rcn.com>
parents: 33862
diff changeset
514 return PyObject_IsTrue(o);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
515 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
516
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
517 static void
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
518 proxy_dealloc(PyWeakReference *self)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
519 {
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
520 if (self->wr_callback != NULL)
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
521 PyObject_GC_UnTrack((PyObject *)self);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
522 clear_weakref(self);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
523 PyObject_GC_Del(self);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
524 }
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
525
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
526 /* sequence slots */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
527
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
528 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36244
diff changeset
529 proxy_slice(PyWeakReference *proxy, Py_ssize_t i, Py_ssize_t j)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
530 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
531 if (!proxy_checkref(proxy))
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
532 return NULL;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
533 return PySequence_GetSlice(PyWeakref_GET_OBJECT(proxy), i, j);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
534 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
535
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
536 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36244
diff changeset
537 proxy_ass_slice(PyWeakReference *proxy, Py_ssize_t i, Py_ssize_t j, PyObject *value)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
538 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
539 if (!proxy_checkref(proxy))
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
540 return -1;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
541 return PySequence_SetSlice(PyWeakref_GET_OBJECT(proxy), i, j, value);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
542 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
543
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
544 static int
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
545 proxy_contains(PyWeakReference *proxy, PyObject *value)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
546 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
547 if (!proxy_checkref(proxy))
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
548 return -1;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
549 return PySequence_Contains(PyWeakref_GET_OBJECT(proxy), value);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
550 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
551
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
552
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
553 /* mapping slots */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
554
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36244
diff changeset
555 static Py_ssize_t
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
556 proxy_length(PyWeakReference *proxy)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
557 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
558 if (!proxy_checkref(proxy))
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
559 return -1;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
560 return PyObject_Length(PyWeakref_GET_OBJECT(proxy));
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
561 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
562
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
563 WRAP_BINARY(proxy_getitem, PyObject_GetItem)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
564
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
565 static int
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
566 proxy_setitem(PyWeakReference *proxy, PyObject *key, PyObject *value)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
567 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
568 if (!proxy_checkref(proxy))
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
569 return -1;
29697
1d763862d1a1 Fix SF 762891: "del p[key]" on proxy object raises SystemError()
Raymond Hettinger <python@rcn.com>
parents: 28644
diff changeset
570
1d763862d1a1 Fix SF 762891: "del p[key]" on proxy object raises SystemError()
Raymond Hettinger <python@rcn.com>
parents: 28644
diff changeset
571 if (value == NULL)
1d763862d1a1 Fix SF 762891: "del p[key]" on proxy object raises SystemError()
Raymond Hettinger <python@rcn.com>
parents: 28644
diff changeset
572 return PyObject_DelItem(PyWeakref_GET_OBJECT(proxy), key);
1d763862d1a1 Fix SF 762891: "del p[key]" on proxy object raises SystemError()
Raymond Hettinger <python@rcn.com>
parents: 28644
diff changeset
573 else
1d763862d1a1 Fix SF 762891: "del p[key]" on proxy object raises SystemError()
Raymond Hettinger <python@rcn.com>
parents: 28644
diff changeset
574 return PyObject_SetItem(PyWeakref_GET_OBJECT(proxy), key, value);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
575 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
576
24717
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
577 /* iterator slots */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
578
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
579 static PyObject *
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
580 proxy_iter(PyWeakReference *proxy)
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
581 {
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
582 if (!proxy_checkref(proxy))
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
583 return NULL;
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
584 return PyObject_GetIter(PyWeakref_GET_OBJECT(proxy));
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
585 }
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
586
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
587 static PyObject *
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
588 proxy_iternext(PyWeakReference *proxy)
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
589 {
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
590 if (!proxy_checkref(proxy))
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
591 return NULL;
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
592 return PyIter_Next(PyWeakref_GET_OBJECT(proxy));
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
593 }
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
594
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
595
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
596 static PyNumberMethods proxy_as_number = {
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
597 proxy_add, /*nb_add*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
598 proxy_sub, /*nb_subtract*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
599 proxy_mul, /*nb_multiply*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
600 proxy_div, /*nb_divide*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
601 proxy_mod, /*nb_remainder*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
602 proxy_divmod, /*nb_divmod*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
603 proxy_pow, /*nb_power*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
604 proxy_neg, /*nb_negative*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
605 proxy_pos, /*nb_positive*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
606 proxy_abs, /*nb_absolute*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
607 (inquiry)proxy_nonzero, /*nb_nonzero*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
608 proxy_invert, /*nb_invert*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
609 proxy_lshift, /*nb_lshift*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
610 proxy_rshift, /*nb_rshift*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
611 proxy_and, /*nb_and*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
612 proxy_xor, /*nb_xor*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
613 proxy_or, /*nb_or*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
614 0, /*nb_coerce*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
615 proxy_int, /*nb_int*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
616 proxy_long, /*nb_long*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
617 proxy_float, /*nb_float*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
618 0, /*nb_oct*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
619 0, /*nb_hex*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
620 proxy_iadd, /*nb_inplace_add*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
621 proxy_isub, /*nb_inplace_subtract*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
622 proxy_imul, /*nb_inplace_multiply*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
623 proxy_idiv, /*nb_inplace_divide*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
624 proxy_imod, /*nb_inplace_remainder*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
625 proxy_ipow, /*nb_inplace_power*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
626 proxy_ilshift, /*nb_inplace_lshift*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
627 proxy_irshift, /*nb_inplace_rshift*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
628 proxy_iand, /*nb_inplace_and*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
629 proxy_ixor, /*nb_inplace_xor*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
630 proxy_ior, /*nb_inplace_or*/
47196
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
631 proxy_floor_div, /*nb_floor_divide*/
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
632 proxy_true_div, /*nb_true_divide*/
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
633 proxy_ifloor_div, /*nb_inplace_floor_divide*/
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
634 proxy_itrue_div, /*nb_inplace_true_divide*/
12c56d2eb4d9 #2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
Georg Brandl <georg@python.org>
parents: 44350
diff changeset
635 proxy_index, /*nb_index*/
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
636 };
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
637
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
638 static PySequenceMethods proxy_as_sequence = {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36244
diff changeset
639 (lenfunc)proxy_length, /*sq_length*/
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
640 0, /*sq_concat*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
641 0, /*sq_repeat*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
642 0, /*sq_item*/
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36244
diff changeset
643 (ssizessizeargfunc)proxy_slice, /*sq_slice*/
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
644 0, /*sq_ass_item*/
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36244
diff changeset
645 (ssizessizeobjargproc)proxy_ass_slice, /*sq_ass_slice*/
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
646 (objobjproc)proxy_contains, /* sq_contains */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
647 };
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
648
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
649 static PyMappingMethods proxy_as_mapping = {
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
650 (lenfunc)proxy_length, /*mp_length*/
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
651 proxy_getitem, /*mp_subscript*/
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
652 (objobjargproc)proxy_setitem, /*mp_ass_subscript*/
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
653 };
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
654
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
655
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
656 PyTypeObject
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
657 _PyWeakref_ProxyType = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 40707
diff changeset
658 PyVarObject_HEAD_INIT(&PyType_Type, 0)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
659 "weakproxy",
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
660 sizeof(PyWeakReference),
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
661 0,
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
662 /* methods */
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
663 (destructor)proxy_dealloc, /* tp_dealloc */
29863
98c59bbdd8ec Remove proxy_print(), since that caused an inconsistency between
Fred Drake <fdrake@acm.org>
parents: 29697
diff changeset
664 0, /* tp_print */
24717
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
665 0, /* tp_getattr */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
666 0, /* tp_setattr */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
667 proxy_compare, /* tp_compare */
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
668 (reprfunc)proxy_repr, /* tp_repr */
24717
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
669 &proxy_as_number, /* tp_as_number */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
670 &proxy_as_sequence, /* tp_as_sequence */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
671 &proxy_as_mapping, /* tp_as_mapping */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
672 0, /* tp_hash */
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
673 0, /* tp_call */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
674 proxy_str, /* tp_str */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
675 proxy_getattr, /* tp_getattro */
24717
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
676 (setattrofunc)proxy_setattr, /* tp_setattro */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
677 0, /* tp_as_buffer */
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
678 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC
24717
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
679 | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
680 0, /* tp_doc */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
681 (traverseproc)gc_traverse, /* tp_traverse */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
682 (inquiry)gc_clear, /* tp_clear */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
683 0, /* tp_richcompare */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
684 0, /* tp_weaklistoffset */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
685 (getiterfunc)proxy_iter, /* tp_iter */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
686 (iternextfunc)proxy_iternext, /* tp_iternext */
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
687 };
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
688
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
689
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
690 PyTypeObject
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
691 _PyWeakref_CallableProxyType = {
42333
6620a510e9a9 PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents: 40707
diff changeset
692 PyVarObject_HEAD_INIT(&PyType_Type, 0)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
693 "weakcallableproxy",
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
694 sizeof(PyWeakReference),
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
695 0,
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
696 /* methods */
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
697 (destructor)proxy_dealloc, /* tp_dealloc */
29863
98c59bbdd8ec Remove proxy_print(), since that caused an inconsistency between
Fred Drake <fdrake@acm.org>
parents: 29697
diff changeset
698 0, /* tp_print */
24717
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
699 0, /* tp_getattr */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
700 0, /* tp_setattr */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
701 proxy_compare, /* tp_compare */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
702 (unaryfunc)proxy_repr, /* tp_repr */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
703 &proxy_as_number, /* tp_as_number */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
704 &proxy_as_sequence, /* tp_as_sequence */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
705 &proxy_as_mapping, /* tp_as_mapping */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
706 0, /* tp_hash */
37304
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
707 proxy_call, /* tp_call */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
708 proxy_str, /* tp_str */
79a0f080f898 Remove unnecessary casts in type object initializers.
Georg Brandl <georg@python.org>
parents: 36877
diff changeset
709 proxy_getattr, /* tp_getattro */
24717
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
710 (setattrofunc)proxy_setattr, /* tp_setattro */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
711 0, /* tp_as_buffer */
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
712 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC
24717
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
713 | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
714 0, /* tp_doc */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
715 (traverseproc)gc_traverse, /* tp_traverse */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
716 (inquiry)gc_clear, /* tp_clear */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
717 0, /* tp_richcompare */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
718 0, /* tp_weaklistoffset */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
719 (getiterfunc)proxy_iter, /* tp_iter */
1d3d980a3186 Add support for the iterator protocol to weakref proxy objects.
Fred Drake <fdrake@acm.org>
parents: 22607
diff changeset
720 (iternextfunc)proxy_iternext, /* tp_iternext */
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
721 };
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
722
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
723
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
724
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
725 PyObject *
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
726 PyWeakref_NewRef(PyObject *ob, PyObject *callback)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
727 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
728 PyWeakReference *result = NULL;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
729 PyWeakReference **list;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
730 PyWeakReference *ref, *proxy;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
731
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
732 if (!PyType_SUPPORTS_WEAKREFS(Py_TYPE(ob))) {
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
733 PyErr_Format(PyExc_TypeError,
20613
bf4b37518c14 Referencable is not a word, so don't use it in an error message <wink>.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20532
diff changeset
734 "cannot create weak reference to '%s' object",
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
735 Py_TYPE(ob)->tp_name);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
736 return NULL;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
737 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
738 list = GET_WEAKREFS_LISTPTR(ob);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
739 get_basic_refs(*list, &ref, &proxy);
31449
b4bc83f2fd04 Fix bug in interpretation of the "callback" argument in the constructors for
Fred Drake <fdrake@acm.org>
parents: 30991
diff changeset
740 if (callback == Py_None)
b4bc83f2fd04 Fix bug in interpretation of the "callback" argument in the constructors for
Fred Drake <fdrake@acm.org>
parents: 30991
diff changeset
741 callback = NULL;
b4bc83f2fd04 Fix bug in interpretation of the "callback" argument in the constructors for
Fred Drake <fdrake@acm.org>
parents: 30991
diff changeset
742 if (callback == NULL)
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
743 /* return existing weak reference if it exists */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
744 result = ref;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
745 if (result != NULL)
31454
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
746 Py_INCREF(result);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
747 else {
31454
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
748 /* Note: new_weakref() can trigger cyclic GC, so the weakref
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
749 list on ob can be mutated. This means that the ref and
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
750 proxy pointers we got back earlier may have been collected,
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
751 so we need to compute these values again before we use
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
752 them. */
22607
ac24c2c9bcaf Remove weakref free list. This has the side effect of fixing a memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 21483
diff changeset
753 result = new_weakref(ob, callback);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
754 if (result != NULL) {
32932
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
755 get_basic_refs(*list, &ref, &proxy);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
756 if (callback == NULL) {
32932
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
757 if (ref == NULL)
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
758 insert_head(result, list);
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
759 else {
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
760 /* Someone else added a ref without a callback
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
761 during GC. Return that one instead of this one
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
762 to avoid violating the invariants of the list
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
763 of weakrefs for ob. */
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
764 Py_DECREF(result);
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
765 Py_INCREF(ref);
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
766 result = ref;
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
767 }
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
768 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
769 else {
31454
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
770 PyWeakReference *prev;
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
771
31454
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
772 prev = (proxy == NULL) ? ref : proxy;
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
773 if (prev == NULL)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
774 insert_head(result, list);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
775 else
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
776 insert_after(result, prev);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
777 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
778 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
779 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
780 return (PyObject *) result;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
781 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
782
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
783
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
784 PyObject *
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
785 PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
786 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
787 PyWeakReference *result = NULL;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
788 PyWeakReference **list;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
789 PyWeakReference *ref, *proxy;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
790
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
791 if (!PyType_SUPPORTS_WEAKREFS(Py_TYPE(ob))) {
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
792 PyErr_Format(PyExc_TypeError,
20613
bf4b37518c14 Referencable is not a word, so don't use it in an error message <wink>.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20532
diff changeset
793 "cannot create weak reference to '%s' object",
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
794 Py_TYPE(ob)->tp_name);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
795 return NULL;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
796 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
797 list = GET_WEAKREFS_LISTPTR(ob);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
798 get_basic_refs(*list, &ref, &proxy);
31449
b4bc83f2fd04 Fix bug in interpretation of the "callback" argument in the constructors for
Fred Drake <fdrake@acm.org>
parents: 30991
diff changeset
799 if (callback == Py_None)
b4bc83f2fd04 Fix bug in interpretation of the "callback" argument in the constructors for
Fred Drake <fdrake@acm.org>
parents: 30991
diff changeset
800 callback = NULL;
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
801 if (callback == NULL)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
802 /* attempt to return an existing weak reference if it exists */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
803 result = proxy;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
804 if (result != NULL)
31454
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
805 Py_INCREF(result);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
806 else {
31454
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
807 /* Note: new_weakref() can trigger cyclic GC, so the weakref
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
808 list on ob can be mutated. This means that the ref and
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
809 proxy pointers we got back earlier may have been collected,
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
810 so we need to compute these values again before we use
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
811 them. */
22607
ac24c2c9bcaf Remove weakref free list. This has the side effect of fixing a memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 21483
diff changeset
812 result = new_weakref(ob, callback);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
813 if (result != NULL) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
814 PyWeakReference *prev;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
815
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
816 if (PyCallable_Check(ob))
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
817 Py_TYPE(result) = &_PyWeakref_CallableProxyType;
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
818 else
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
819 Py_TYPE(result) = &_PyWeakref_ProxyType;
31454
d4165d12f73c Allocating a new weakref object can cause existing weakref objects for
Fred Drake <fdrake@acm.org>
parents: 31449
diff changeset
820 get_basic_refs(*list, &ref, &proxy);
32932
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
821 if (callback == NULL) {
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
822 if (proxy != NULL) {
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
823 /* Someone else added a proxy without a callback
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
824 during GC. Return that one instead of this one
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
825 to avoid violating the invariants of the list
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
826 of weakrefs for ob. */
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
827 Py_DECREF(result);
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
828 Py_INCREF(result = proxy);
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
829 goto skip_insert;
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
830 }
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
831 prev = ref;
32932
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
832 }
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
833 else
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
834 prev = (proxy == NULL) ? ref : proxy;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
835
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
836 if (prev == NULL)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
837 insert_head(result, list);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
838 else
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
839 insert_after(result, prev);
32932
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
840 skip_insert:
bd3dd6b3ff97 Be more careful about maintaining the invariants; it was actually
Fred Drake <fdrake@acm.org>
parents: 32530
diff changeset
841 ;
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
842 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
843 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
844 return (PyObject *) result;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
845 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
846
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
847
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
848 PyObject *
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
849 PyWeakref_GetObject(PyObject *ref)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
850 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
851 if (ref == NULL || !PyWeakref_Check(ref)) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
852 PyErr_BadInternalCall();
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
853 return NULL;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
854 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
855 return PyWeakref_GET_OBJECT(ref);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
856 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
857
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 32932
diff changeset
858 /* Note that there's an inlined copy-paste of handle_callback() in gcmodule.c's
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 32932
diff changeset
859 * handle_weakrefs().
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 32932
diff changeset
860 */
21339
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
861 static void
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
862 handle_callback(PyWeakReference *ref, PyObject *callback)
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
863 {
38314
1fdf29a88f0e Replace PyObject_CallFunction calls with only object args
Georg Brandl <georg@python.org>
parents: 37756
diff changeset
864 PyObject *cbresult = PyObject_CallFunctionObjArgs(callback, ref, NULL);
21339
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
865
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
866 if (cbresult == NULL)
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
867 PyErr_WriteUnraisable(callback);
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
868 else
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
869 Py_DECREF(cbresult);
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
870 }
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
871
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
872 /* This function is called by the tp_dealloc handler to clear weak references.
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
873 *
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
874 * This iterates through the weak references for 'object' and calls callbacks
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
875 * for those references which have one. It returns when all callbacks have
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
876 * been attempted.
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
877 */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
878 void
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
879 PyObject_ClearWeakRefs(PyObject *object)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
880 {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
881 PyWeakReference **list;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
882
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
883 if (object == NULL
44350
26384b8180c7 #1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents: 42333
diff changeset
884 || !PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
885 || object->ob_refcnt != 0) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
886 PyErr_BadInternalCall();
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
887 return;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
888 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
889 list = GET_WEAKREFS_LISTPTR(object);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
890 /* Remove the callback-less basic and proxy references */
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
891 if (*list != NULL && (*list)->wr_callback == NULL) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
892 clear_weakref(*list);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
893 if (*list != NULL && (*list)->wr_callback == NULL)
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
894 clear_weakref(*list);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
895 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
896 if (*list != NULL) {
21339
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
897 PyWeakReference *current = *list;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36244
diff changeset
898 Py_ssize_t count = _PyWeakref_GetWeakrefCount(current);
21339
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
899 int restore_error = PyErr_Occurred() ? 1 : 0;
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
900 PyObject *err_type, *err_value, *err_tb;
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
901
21339
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
902 if (restore_error)
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
903 PyErr_Fetch(&err_type, &err_value, &err_tb);
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
904 if (count == 1) {
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
905 PyObject *callback = current->wr_callback;
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
906
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
907 current->wr_callback = NULL;
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
908 clear_weakref(current);
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
909 if (callback != NULL) {
47732
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
910 if (current->ob_refcnt > 0)
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
911 handle_callback(current, callback);
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
912 Py_DECREF(callback);
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
913 }
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
914 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
915 else {
36877
e9a7a2784e17 SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 36675
diff changeset
916 PyObject *tuple;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36244
diff changeset
917 Py_ssize_t i = 0;
36877
e9a7a2784e17 SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 36675
diff changeset
918
e9a7a2784e17 SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 36675
diff changeset
919 tuple = PyTuple_New(count * 2);
e9a7a2784e17 SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 36675
diff changeset
920 if (tuple == NULL) {
e9a7a2784e17 SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 36675
diff changeset
921 if (restore_error)
e9a7a2784e17 SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 36675
diff changeset
922 PyErr_Fetch(&err_type, &err_value, &err_tb);
e9a7a2784e17 SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 36675
diff changeset
923 return;
e9a7a2784e17 SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 36675
diff changeset
924 }
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
925
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
926 for (i = 0; i < count; ++i) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
927 PyWeakReference *next = current->wr_next;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
928
47732
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
929 if (current->ob_refcnt > 0)
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
930 {
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
931 Py_INCREF(current);
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
932 PyTuple_SET_ITEM(tuple, i * 2, (PyObject *) current);
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
933 PyTuple_SET_ITEM(tuple, i * 2 + 1, current->wr_callback);
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
934 }
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
935 else {
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
936 Py_DECREF(current->wr_callback);
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
937 }
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
938 current->wr_callback = NULL;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
939 clear_weakref(current);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
940 current = next;
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
941 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
942 for (i = 0; i < count; ++i) {
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
943 PyObject *callback = PyTuple_GET_ITEM(tuple, i * 2 + 1);
21339
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
944
47732
b8e9cc28022c Issue 3110: Crash with weakref subclass,
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47527
diff changeset
945 /* The tuple may have slots left to NULL */
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
946 if (callback != NULL) {
36244
e7880f4f53a4 Remove some shadowed variables
Neal Norwitz <nnorwitz@gmail.com>
parents: 35999
diff changeset
947 PyObject *item = PyTuple_GET_ITEM(tuple, i * 2);
e7880f4f53a4 Remove some shadowed variables
Neal Norwitz <nnorwitz@gmail.com>
parents: 35999
diff changeset
948 handle_callback((PyWeakReference *)item, callback);
32472
4383db77b19a Make weak references subclassable:
Fred Drake <fdrake@acm.org>
parents: 31454
diff changeset
949 }
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
950 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
951 Py_DECREF(tuple);
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
952 }
21339
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
953 if (restore_error)
525c77368cd0 Make sure that when we invoke callback functions associated with weak
Fred Drake <fdrake@acm.org>
parents: 21083
diff changeset
954 PyErr_Restore(err_type, err_value, err_tb);
20280
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
955 }
97cfa461d793 The weak reference implementation, separated from the weakref module.
Fred Drake <fdrake@acm.org>
parents:
diff changeset
956 }