Skip to content

Commit efff6a3

Browse files
sbc100juj
andauthored
Fix parallel test suite failure reporting with python 3.11 (#19517)
Forked from #19219 Co-authored-by: Jukka Jylänki <jujjyl@gmail.com>
1 parent 6890c75 commit efff6a3

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

test/parallel_testsuite.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,23 +167,41 @@ def updateResult(self, result):
167167
result.addSkip(self.test, self.reason)
168168

169169

170+
def fixup_fake_exception(fake_exc):
171+
ex = fake_exc[2]
172+
if ex.tb_frame.f_code.positions is None:
173+
return
174+
while ex is not None:
175+
# .co_positions is supposed to be a function that returns an enumerable
176+
# to the list of code positions. Create a function object wrapper around
177+
# the data
178+
def make_wrapper(rtn):
179+
return lambda: rtn
180+
ex.tb_frame.f_code.co_positions = make_wrapper(ex.tb_frame.f_code.positions)
181+
ex = ex.tb_next
182+
183+
170184
class BufferedTestFailure(BufferedTestBase):
171185
def updateResult(self, result):
186+
fixup_fake_exception(self.error)
172187
result.addFailure(self.test, self.error)
173188

174189

175190
class BufferedTestExpectedFailure(BufferedTestBase):
176191
def updateResult(self, result):
192+
fixup_fake_exception(self.error)
177193
result.addExpectedFailure(self.test, self.error)
178194

179195

180196
class BufferedTestError(BufferedTestBase):
181197
def updateResult(self, result):
198+
fixup_fake_exception(self.error)
182199
result.addError(self.test, self.error)
183200

184201

185202
class BufferedTestUnexpectedSuccess(BufferedTestBase):
186203
def updateResult(self, result):
204+
fixup_fake_exception(self.error)
187205
result.addUnexpectedSuccess(self.test)
188206

189207

@@ -203,6 +221,7 @@ def __init__(self, tb):
203221
self.tb_frame = FakeFrame(tb.tb_frame)
204222
self.tb_lineno = tb.tb_lineno
205223
self.tb_next = FakeTraceback(tb.tb_next) if tb.tb_next is not None else None
224+
self.tb_lasti = tb.tb_lasti
206225

207226

208227
class FakeFrame():
@@ -216,6 +235,12 @@ class FakeCode():
216235
def __init__(self, co):
217236
self.co_filename = co.co_filename
218237
self.co_name = co.co_name
238+
# co.co_positions() returns an iterator. Flatten it to a list so that it can
239+
# be pickled to the parent process
240+
if hasattr(co, 'co_positions'):
241+
self.positions = list(co.co_positions())
242+
else:
243+
self.positions = None
219244

220245

221246
def num_cores():

0 commit comments

Comments
 (0)