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)

`