gh-108634: Py_TRACE_REFS uses a hash table (#108663) · andersk/cpython@13a0007 (original) (raw)
`@@ -173,9 +173,11 @@ def test_set_traceback_limit(self):
`
173
173
`self.assertEqual(len(traceback), 1)
`
174
174
`self.assertEqual(traceback, obj_traceback)
`
175
175
``
176
``
`-
def find_trace(self, traces, traceback):
`
``
176
`+
def find_trace(self, traces, traceback, size):
`
``
177
`+
filter also by size to ignore the memory allocated by
`
``
178
`+
_PyRefchain_Trace() if Python is built with Py_TRACE_REFS.
`
177
179
`for trace in traces:
`
178
``
`-
if trace[2] == traceback._frames:
`
``
180
`+
if trace[2] == traceback._frames and trace[1] == size:
`
179
181
`return trace
`
180
182
``
181
183
`self.fail("trace not found")
`
`@@ -186,11 +188,10 @@ def test_get_traces(self):
`
186
188
`obj, obj_traceback = allocate_bytes(obj_size)
`
187
189
``
188
190
`traces = tracemalloc._get_traces()
`
189
``
`-
trace = self.find_trace(traces, obj_traceback)
`
``
191
`+
trace = self.find_trace(traces, obj_traceback, obj_size)
`
190
192
``
191
193
`self.assertIsInstance(trace, tuple)
`
192
194
`domain, size, traceback, length = trace
`
193
``
`-
self.assertEqual(size, obj_size)
`
194
195
`self.assertEqual(traceback, obj_traceback._frames)
`
195
196
``
196
197
`tracemalloc.stop()
`
`@@ -208,17 +209,18 @@ def allocate_bytes4(size):
`
208
209
`# Ensure that two identical tracebacks are not duplicated
`
209
210
`tracemalloc.stop()
`
210
211
`tracemalloc.start(4)
`
211
``
`-
obj_size = 123
`
212
``
`-
obj1, obj1_traceback = allocate_bytes4(obj_size)
`
213
``
`-
obj2, obj2_traceback = allocate_bytes4(obj_size)
`
``
212
`+
obj1_size = 123
`
``
213
`+
obj2_size = 125
`
``
214
`+
obj1, obj1_traceback = allocate_bytes4(obj1_size)
`
``
215
`+
obj2, obj2_traceback = allocate_bytes4(obj2_size)
`
214
216
``
215
217
`traces = tracemalloc._get_traces()
`
216
218
``
217
219
`obj1_traceback._frames = tuple(reversed(obj1_traceback._frames))
`
218
220
`obj2_traceback._frames = tuple(reversed(obj2_traceback._frames))
`
219
221
``
220
``
`-
trace1 = self.find_trace(traces, obj1_traceback)
`
221
``
`-
trace2 = self.find_trace(traces, obj2_traceback)
`
``
222
`+
trace1 = self.find_trace(traces, obj1_traceback, obj1_size)
`
``
223
`+
trace2 = self.find_trace(traces, obj2_traceback, obj2_size)
`
222
224
`domain1, size1, traceback1, length1 = trace1
`
223
225
`domain2, size2, traceback2, length2 = trace2
`
224
226
`self.assertIs(traceback2, traceback1)
`