diff --git a/coverage/control.py b/coverage/control.py index ca757e9e1..c4e325212 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -536,7 +536,7 @@ def _init_for_start(self) -> None: self._core = Core( warn=self._warn, - timid=self.config.timid, + config=self.config, metacov=self._metacov, ) self._collector = Collector( diff --git a/coverage/core.py b/coverage/core.py index b8916b683..7affeb2e2 100644 --- a/coverage/core.py +++ b/coverage/core.py @@ -10,6 +10,7 @@ from typing import Any from coverage import env +from coverage.config import CoverageConfig from coverage.disposition import FileDisposition from coverage.exceptions import ConfigError from coverage.pytracer import PyTracer @@ -49,16 +50,9 @@ class Core: packed_arcs: bool systrace: bool - def __init__(self, - warn: TWarnFn, - timid: bool, - metacov: bool, - ) -> None: - # Defaults - self.tracer_kwargs = {} - + def __init__(self, warn: TWarnFn, config: CoverageConfig, metacov: bool) -> None: core_name: str | None - if timid: + if config.timid: core_name = "pytrace" else: core_name = os.getenv("COVERAGE_CORE") @@ -76,9 +70,11 @@ def __init__(self, else: core_name = "pytrace" + self.tracer_kwargs = {} + if core_name == "sysmon": self.tracer_class = SysMonitor - self.tracer_kwargs = {"tool_id": 3 if metacov else 1} + self.tracer_kwargs["tool_id"] = 3 if metacov else 1 self.file_disposition_class = FileDisposition self.supports_plugins = False self.packed_arcs = False diff --git a/coverage/env.py b/coverage/env.py index 3bae7e51a..792ed1d5f 100644 --- a/coverage/env.py +++ b/coverage/env.py @@ -112,6 +112,12 @@ class PYBEHAVIOR: # https://github.com/python/cpython/issues/113728 lasti_is_yield = (PYVERSION[:2] != (3, 13)) + # Does sys.monitoring support BRANCH_TAKEN? + branch_taken = ( + pep669 and + hasattr(sys.monitoring.events, "BRANCH_TAKEN") # type:ignore[attr-defined] + ) + # Coverage.py specifics, about testing scenarios. See tests/testenv.py also. diff --git a/coverage/sysmon.py b/coverage/sysmon.py index ef54292f3..bbbe42390 100644 --- a/coverage/sysmon.py +++ b/coverage/sysmon.py @@ -23,6 +23,7 @@ cast, ) +from coverage import env from coverage.debug import short_filename, short_stack from coverage.types import ( AnyCallable, @@ -352,8 +353,9 @@ def sysmon_py_start(self, code: CodeType, instruction_offset: int) -> MonitorRet # | events.PY_RESUME # | events.PY_YIELD - | events.LINE, - # | events.BRANCH + | events.LINE + | events.BRANCH_TAKEN + | events.BRANCH_NOT_TAKEN # | events.JUMP ) self.local_event_codes[id(code)] = code