opencrbasic 1.1.0__tar.gz → 1.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/PKG-INFO +4 -5
  2. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/README.md +3 -4
  3. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/pyproject.toml +4 -2
  4. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/__init__.py +1 -1
  5. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/analysis.py +1 -1
  6. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/__init__.py +7 -4
  7. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/cr3xx.py +268 -50
  8. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/expressions.py +314 -67
  9. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/instr_data.py +221 -56
  10. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/instr_measure.py +297 -47
  11. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/instr_rules.py +307 -58
  12. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/intervals.py +2 -0
  13. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/structure.py +128 -36
  14. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/symbols.py +10 -5
  15. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/terminals.py +187 -9
  16. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/var_types.py +35 -6
  17. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/warnings.py +12 -9
  18. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checks.py +4 -4
  19. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/cli.py +7 -2
  20. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/compiler.py +1 -1
  21. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/measure.json +3 -1
  22. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/terminals.json +2 -0
  23. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/measure.json +7 -0
  24. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/status_members.json +0 -1
  25. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/terminals.json +1 -0
  26. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/measure.json +7 -0
  27. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/terminals.json +1 -0
  28. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/measure.json +3 -1
  29. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/notices_cr6.json +2 -61
  30. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/terminals.json +11 -1
  31. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/parser.py +96 -26
  32. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/syntax.py +5 -0
  33. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/tables.py +13 -9
  34. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/tests/corpus/README.md +21 -21
  35. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/.gitignore +0 -0
  36. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/LICENSE +0 -0
  37. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/__main__.py +0 -0
  38. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/bindings.py +0 -0
  39. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/catalog.py +0 -0
  40. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checkconfig.py +0 -0
  41. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/ess.py +0 -0
  42. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/instructions.py +0 -0
  43. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/longconv.py +0 -0
  44. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/scan_time.py +0 -0
  45. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/storage.py +0 -0
  46. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/structs.py +0 -0
  47. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/checker/unused.py +0 -0
  48. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/commands.py +0 -0
  49. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/consteval.py +0 -0
  50. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/background_calibration.json +0 -0
  51. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/before_beginprog.json +0 -0
  52. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/background_calibration.json +0 -0
  53. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/before_beginprog.json +0 -0
  54. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/ess_variables.json +0 -0
  55. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/fnotch.json +0 -0
  56. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/functions.json +0 -0
  57. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/instructions.json +0 -0
  58. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/mode.json +0 -0
  59. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/pipeline_tasks.json +0 -0
  60. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/settings_fields.json +0 -0
  61. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/status_members.json +0 -0
  62. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr1000x/symbols.json +0 -0
  63. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/before_beginprog.json +0 -0
  64. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/ess_variables.json +0 -0
  65. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/fnotch.json +0 -0
  66. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/functions.json +0 -0
  67. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/instructions.json +0 -0
  68. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/mode.json +0 -0
  69. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/settings_fields.json +0 -0
  70. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr300/symbols.json +0 -0
  71. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/before_beginprog.json +0 -0
  72. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/ess_variables.json +0 -0
  73. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/fnotch.json +0 -0
  74. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/functions.json +0 -0
  75. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/instructions.json +0 -0
  76. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/mode.json +0 -0
  77. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/settings_fields.json +0 -0
  78. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/status_members.json +0 -0
  79. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/cr350/symbols.json +0 -0
  80. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/ess_variables.json +0 -0
  81. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/fnotch.json +0 -0
  82. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/functions.json +0 -0
  83. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/instructions.json +0 -0
  84. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/mode.json +0 -0
  85. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/pipeline_tasks.json +0 -0
  86. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/settings_fields.json +0 -0
  87. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/status_members.json +0 -0
  88. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/status_table.json +0 -0
  89. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/symbols.json +0 -0
  90. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/data/type_codes.json +0 -0
  91. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/diagnostics.py +0 -0
  92. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/editing.py +0 -0
  93. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/formatting.py +0 -0
  94. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/helpdocs.py +0 -0
  95. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/hover.py +0 -0
  96. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/inlay.py +0 -0
  97. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/lexer.py +0 -0
  98. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/lsp/__init__.py +0 -0
  99. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/lsp/__main__.py +0 -0
  100. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/lsp/config.py +0 -0
  101. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/lsp/features.py +0 -0
  102. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/lsp/server.py +0 -0
  103. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/lsp/session.py +0 -0
  104. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/lsp/worker.py +0 -0
  105. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/macros.py +0 -0
  106. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/mode.py +0 -0
  107. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/navigation.py +0 -0
  108. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/positions.py +0 -0
  109. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/preprocess.py +0 -0
  110. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/profiles.py +0 -0
  111. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/provenance.py +0 -0
  112. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/quickfix.py +0 -0
  113. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/rename.py +0 -0
  114. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/signature.py +0 -0
  115. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/source.py +0 -0
  116. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/sources.py +0 -0
  117. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/tables_hook.py +0 -0
  118. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/tdf.py +0 -0
  119. {opencrbasic-1.1.0 → opencrbasic-1.2.0}/src/opencrbasic/timing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: opencrbasic
3
- Version: 1.1.0
3
+ Version: 1.2.0
4
4
  Summary: Open-source re-implementation of the Campbell Scientific CRBasic pre-compilers (CR6, CR1000X, CR300, CR350)
5
5
  Project-URL: Repository, https://github.com/UtrechtUniversity/open-crbasic
6
6
  Author: Utrecht University
@@ -38,8 +38,8 @@ Status, measured against the real compilers: `PROGRESS.md`. Design and the v1.0
38
38
  ## Scope
39
39
 
40
40
  - **Gated profiles: CR6 and CR1000X.** On these, v1.0 gates the reference verdict in the relevant
41
- area (the FirnMelt/GEUS instruction set and language constructs), the execution mode, and the
42
- first error for realistic mistakes on relevant rules, measured on the FirnMelt programs, the 507
41
+ area (the station/GEUS instruction set and language constructs), the execution mode, and the
42
+ first error for realistic mistakes on relevant rules, measured on the station programs, the 507
43
43
  CRBasic help examples, the 66 GEUS programs, the saved fuzz replay and fresh `--relevant` fuzz
44
44
  seeds. The help examples and GEUS programs are not redistributed here; see
45
45
  [tests/corpus/README.md](tests/corpus/README.md) for running against local copies. One relevant-area false accept is known: a `Sub` name that is also another routine's
@@ -159,8 +159,7 @@ result.tables # list of tdf.TdfTable (Status, DataTables, DataTableInfo, ConstT
159
159
  `parser.parse_file()` gives the syntax tree (`syntax.py`) for other tools.
160
160
 
161
161
  [openloggernet](https://github.com/UtrechtUniversity/open-loggernet) uses opencrbasic when
162
- `CR6COMP=opencrbasic` is set, and the FirnMelt station repository compiles every program with it in
163
- CI.
162
+ `CR6COMP=opencrbasic` is set.
164
163
 
165
164
  ## Editor support
166
165
 
@@ -21,8 +21,8 @@ Status, measured against the real compilers: `PROGRESS.md`. Design and the v1.0
21
21
  ## Scope
22
22
 
23
23
  - **Gated profiles: CR6 and CR1000X.** On these, v1.0 gates the reference verdict in the relevant
24
- area (the FirnMelt/GEUS instruction set and language constructs), the execution mode, and the
25
- first error for realistic mistakes on relevant rules, measured on the FirnMelt programs, the 507
24
+ area (the station/GEUS instruction set and language constructs), the execution mode, and the
25
+ first error for realistic mistakes on relevant rules, measured on the station programs, the 507
26
26
  CRBasic help examples, the 66 GEUS programs, the saved fuzz replay and fresh `--relevant` fuzz
27
27
  seeds. The help examples and GEUS programs are not redistributed here; see
28
28
  [tests/corpus/README.md](tests/corpus/README.md) for running against local copies. One relevant-area false accept is known: a `Sub` name that is also another routine's
@@ -142,8 +142,7 @@ result.tables # list of tdf.TdfTable (Status, DataTables, DataTableInfo, ConstT
142
142
  `parser.parse_file()` gives the syntax tree (`syntax.py`) for other tools.
143
143
 
144
144
  [openloggernet](https://github.com/UtrechtUniversity/open-loggernet) uses opencrbasic when
145
- `CR6COMP=opencrbasic` is set, and the FirnMelt station repository compiles every program with it in
146
- CI.
145
+ `CR6COMP=opencrbasic` is set.
147
146
 
148
147
  ## Editor support
149
148
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "opencrbasic"
3
- version = "1.1.0"
3
+ version = "1.2.0"
4
4
  description = "Open-source re-implementation of the Campbell Scientific CRBasic pre-compilers (CR6, CR1000X, CR300, CR350)"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -31,7 +31,8 @@ crbc-lsp = "opencrbasic.lsp.server:main"
31
31
  # `uv sync` installs `dev` by default: the test runner and the reverse-engineering tools
32
32
  # (`tools/extract_tables.py`, `tools/message_catalog.py` read the exe with pefile), and pygls
33
33
  # so the suite can test the language server; pytest-xdist for parallel test runs (`-n`); pyrefly
34
- # checks the repository (`[tool.pyrefly]`); pre-commit runs ruff and pyrefly before each commit.
34
+ # checks the repository (`[tool.pyrefly]`); pre-commit runs ruff and pyrefly before each commit;
35
+ # openloggernet drives a logger for `tools/logger_oracle.py`.
35
36
  dev = [
36
37
  "pytest>=8",
37
38
  "pefile>=2024.8.26",
@@ -39,6 +40,7 @@ dev = [
39
40
  "pytest-xdist>=3.6",
40
41
  "pyrefly==1.3.1",
41
42
  "pre-commit>=4",
43
+ "openloggernet>=0.3.0",
42
44
  ]
43
45
 
44
46
  [build-system]
@@ -1,3 +1,3 @@
1
1
  """Open-source CRBasic (CR6) pre-compiler."""
2
2
 
3
- __version__ = "1.1.0"
3
+ __version__ = "1.2.0"
@@ -14,7 +14,7 @@ from .compiler import compile_file
14
14
  from .sources import DiskSource, LimitedSource, OverlaySource, RecordingSource, SourceProvider
15
15
 
16
16
  API_VERSION = 2 # 2: findings, notices, config_error, AnalysisRequest.checks (M6)
17
- DOCS = "https://github.com/UtrechtUniversity/firnmelt-datalogger/blob/main/opencrbasic/"
17
+ DOCS = "https://github.com/UtrechtUniversity/open-crbasic/blob/main/"
18
18
 
19
19
 
20
20
  def _no_overlays() -> Mapping[Path, bytes]:
@@ -111,6 +111,7 @@ from . import (
111
111
  storage,
112
112
  structs,
113
113
  structure,
114
+ terminals,
114
115
  var_types,
115
116
  warnings,
116
117
  )
@@ -265,6 +266,7 @@ def _check(program: S.Program, profile: Profile, diags: Diagnostics, result) ->
265
266
  del diags.items[program.hash_cut :] # parser findings of later lines
266
267
  program = structure.open_program_at_slowsequence(program, profile)
267
268
  env = consteval.Env(profile, dict(program.consts))
269
+ expressions.set_arity_context(program, profile)
268
270
 
269
271
  _run_pass(structure.check_pass1, program, profile, diags, env)
270
272
  # Also pass 1 (unconditional -- oracle-confirmed, `docs/loggers.md`): a `Const`'s own value
@@ -411,6 +413,7 @@ def _check(program: S.Program, profile: Profile, diags: Diagnostics, result) ->
411
413
  # "stop entirely at the first placement error" behaviour.
412
414
  pass2_start = len(diags.items)
413
415
  _run_pass(instr_rules.check_spi_open_order, _with_inline(program), profile, leading)
416
+ _run_pass(terminals.check_i2c_open_order, _with_inline(program), profile, ranges, env)
414
417
  # Block-closer messages come before a same-line placement error (`EndIf illegally
415
418
  # occurs before BeginProg.` follows `END IF without IF...`).
416
419
  # CR300/CR350: collected aside in `leading` (printed first on their line, but they do not
@@ -743,6 +746,7 @@ def _check(program: S.Program, profile: Profile, diags: Diagnostics, result) ->
743
746
  # instructions placed outside `DataTable...EndTable`, and an orphan `EndTable`.
744
747
  table_stop = _run_pass_capture(instr_data.check_table_structure, _with_inline(program), profile, diags)
745
748
  _run_pass(instr_data.check_fieldnames, program, profile, diags, env)
749
+ _run_pass(instr_data.check_fieldclassify, program, profile, diags, env)
746
750
  apply_diags = Diagnostics()
747
751
  _run_pass(structure.check_apply_restart_sequence, program, profile, apply_diags)
748
752
  for extra in apply_diags.items: # in source order among the tier-C findings
@@ -953,10 +957,9 @@ def _check(program: S.Program, profile: Profile, diags: Diagnostics, result) ->
953
957
 
954
958
  if not diags.errors:
955
959
  # `When Main Sequence Scan %d is running, background calibration will be disabled.`:
956
- # round 6, moved here from the unconditional `warnings.check_early` call above -- oracle-
957
- # confirmed *not* ungated the way `_check_reachability`/`_check_fnotch` are, unlike this
958
- # module's own docstring previously claimed for all of `check_early` (`checker/warnings.py`'s
959
- # `check_background_calibration` docstring has the oracle evidence). Independent of
960
+ # oracle-confirmed *not* ungated the way `_check_reachability`/`_check_fnotch` are
961
+ # (`checker/warnings.py`'s `check_background_calibration` docstring has the oracle evidence).
962
+ # Independent of
960
963
  # `tables_hook`'s own availability, so called ahead of that guard rather than inside it.
961
964
  _run_pass(warnings.check_background_calibration, program, profile, diags, env)
962
965
  _run_pass(warnings.check_slow_scan_skips, program, profile, diags, env)