A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/python/cpython/commit/5a8516701f5140c8c989c40e261a4f4e20e8af86 below:

Per-frame control of trace events (GH-3417) · python/cpython@5a85167 · GitHub

@@ -234,16 +234,29 @@ def generator_example():

234 234 235 235 236 236

class Tracer:

237 -

def __init__(self):

237 +

def __init__(self, trace_line_events=None, trace_opcode_events=None):

238 +

self.trace_line_events = trace_line_events

239 +

self.trace_opcode_events = trace_opcode_events

238 240

self.events = []

241 + 242 +

def _reconfigure_frame(self, frame):

243 +

if self.trace_line_events is not None:

244 +

frame.f_trace_lines = self.trace_line_events

245 +

if self.trace_opcode_events is not None:

246 +

frame.f_trace_opcodes = self.trace_opcode_events

247 + 239 248

def trace(self, frame, event, arg):

249 +

self._reconfigure_frame(frame)

240 250

self.events.append((frame.f_lineno, event))

241 251

return self.trace

252 + 242 253

def traceWithGenexp(self, frame, event, arg):

254 +

self._reconfigure_frame(frame)

243 255

(o for o in [1])

244 256

self.events.append((frame.f_lineno, event))

245 257

return self.trace

246 258 259 + 247 260

class TraceTestCase(unittest.TestCase):

248 261 249 262

# Disable gc collection when tracing, otherwise the

@@ -257,6 +270,11 @@ def tearDown(self):

257 270

if self.using_gc:

258 271

gc.enable()

259 272 273 +

@staticmethod

274 +

def make_tracer():

275 +

"""Helper to allow test subclasses to configure tracers differently"""

276 +

return Tracer()

277 + 260 278

def compare_events(self, line_offset, events, expected_events):

261 279

events = [(l - line_offset, e) for (l, e) in events]

262 280

if events != expected_events:

@@ -266,7 +284,7 @@ def compare_events(self, line_offset, events, expected_events):

266 284

[str(x) for x in events])))

267 285 268 286

def run_and_compare(self, func, events):

269 -

tracer = Tracer()

287 +

tracer = self.make_tracer()

270 288

sys.settrace(tracer.trace)

271 289

func()

272 290

sys.settrace(None)

@@ -277,7 +295,7 @@ def run_test(self, func):

277 295

self.run_and_compare(func, func.events)

278 296 279 297

def run_test2(self, func):

280 -

tracer = Tracer()

298 +

tracer = self.make_tracer()

281 299

func(tracer.trace)

282 300

sys.settrace(None)

283 301

self.compare_events(func.__code__.co_firstlineno,

@@ -329,7 +347,7 @@ def test_13_genexp(self):

329 347

# and if the traced function contains another generator

330 348

# that is not completely exhausted, the trace stopped.

331 349

# Worse: the 'finally' clause was not invoked.

332 -

tracer = Tracer()

350 +

tracer = self.make_tracer()

333 351

sys.settrace(tracer.traceWithGenexp)

334 352

generator_example()

335 353

sys.settrace(None)

@@ -398,6 +416,34 @@ def func():

398 416

(1, 'line')])

399 417 400 418 419 +

class SkipLineEventsTraceTestCase(TraceTestCase):

420 +

"""Repeat the trace tests, but with per-line events skipped"""

421 + 422 +

def compare_events(self, line_offset, events, expected_events):

423 +

skip_line_events = [e for e in expected_events if e[1] != 'line']

424 +

super().compare_events(line_offset, events, skip_line_events)

425 + 426 +

@staticmethod

427 +

def make_tracer():

428 +

return Tracer(trace_line_events=False)

429 + 430 + 431 +

@support.cpython_only

432 +

class TraceOpcodesTestCase(TraceTestCase):

433 +

"""Repeat the trace tests, but with per-opcodes events enabled"""

434 + 435 +

def compare_events(self, line_offset, events, expected_events):

436 +

skip_opcode_events = [e for e in events if e[1] != 'opcode']

437 +

if len(events) > 1:

438 +

self.assertLess(len(skip_opcode_events), len(events),

439 +

msg="No 'opcode' events received by the tracer")

440 +

super().compare_events(line_offset, skip_opcode_events, expected_events)

441 + 442 +

@staticmethod

443 +

def make_tracer():

444 +

return Tracer(trace_opcode_events=True)

445 + 446 + 401 447

class RaisingTraceFuncTestCase(unittest.TestCase):

402 448

def setUp(self):

403 449

self.addCleanup(sys.settrace, sys.gettrace())

@@ -846,6 +892,8 @@ class fake_function:

846 892

def test_main():

847 893

support.run_unittest(

848 894

TraceTestCase,

895 +

SkipLineEventsTraceTestCase,

896 +

TraceOpcodesTestCase,

849 897

RaisingTraceFuncTestCase,

850 898

JumpTestCase

851 899

)


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4