mirror of
https://github.com/imjasonh/nescript
synced 2026-07-08 00:45:38 +00:00
pipeline: share a single compile function across CLI, bench, and tests
The compile bench had a hand-maintained parallel copy of `src/main.rs::compile`, and that copy went out of sync after bank switching landed — the bench kept handing the linker `PrgBank::empty(...)` slots even though the CLI started populating per-bank instruction streams + trampoline requests. The assembler then panicked with `unresolved label: '__tramp_step_animation'` on `uxrom_user_banked.ne` under `cargo test --all-targets`, which is what CI runs. A plain `cargo test --release` (what CLAUDE.md used to document) never builds the bench so the bug slipped through local validation. Fix: - New `nescript::pipeline` module with `compile_source(source, source_dir, &CompileOptions)` that owns the full `parse → analyze → lower → optimize → codegen → peephole → link` pipeline including the per-bank stream + trampoline reconstruction. Returns a `CompileOutput` carrying the ROM, the linker result, analysis, IR, assets, instructions, and source-loc markers so downstream tools have one place to pull metadata from. - `src/main.rs::compile` reduces to file I/O + preprocessing + a single `compile_source` call + CLI-only side effects (`--dump-ir`, `--call-graph`, `--asm-dump`, `--memory-map`, `--symbols`, `--source-map`). - `benches/compile.rs::compile_pipeline` becomes a one-line `compile_source` call. It is now structurally impossible for the bench to drift from the CLI path. - `tests/integration_test.rs::compile_with_debug_artifacts` likewise delegates to `compile_source`. This also fixes a latent bug in the helper where it used `Linker::with_mapper` without `.with_header(...)` — programs opting into `header: nes2` would have quietly got an iNES 1.0 header through this path. - `CLAUDE.md`: updated the "Running the basics" section to specify `cargo test --all-targets` (plain `cargo test` skips benches) and to point at `scripts/pre-commit` with the exact install command. Also installed the hook in this worktree. All 24 existing `examples/*.nes` rebuild byte-identical through the new pipeline. 624 tests + all 25 emulator goldens pass. https://claude.ai/code/session_01MaNVcDmK9gsspRkdxowQAM
This commit is contained in:
parent
889074a415
commit
2966a6ab17
6 changed files with 362 additions and 359 deletions
27
CLAUDE.md
27
CLAUDE.md
|
|
@ -44,13 +44,32 @@ re-derive the project conventions from scratch.
|
|||
## Running the basics
|
||||
|
||||
```bash
|
||||
cargo build --release # build the compiler
|
||||
cargo test # all Rust tests (lib + integration)
|
||||
cargo fmt # mandatory before committing
|
||||
cargo clippy --all-targets # mandatory before committing; fix or #[allow]
|
||||
cargo build --release # build the compiler
|
||||
cargo test --all-targets # all Rust tests — MUST include --all-targets
|
||||
cargo fmt # mandatory before committing
|
||||
cargo clippy --all-targets -- -D warnings # mandatory; fix or #[allow]
|
||||
./target/release/nescript build examples/hello_sprite.ne # build one ROM
|
||||
```
|
||||
|
||||
**Always pass `--all-targets` to `cargo test`.** CI runs `cargo test
|
||||
--all-targets`, which additionally compiles and smoke-runs the `compile`
|
||||
benchmark under `benches/compile.rs`. A plain `cargo test` skips that,
|
||||
so a bench that doesn't compile will pass locally and red-flag CI —
|
||||
this exact failure mode bit us once already (commit `889074a`).
|
||||
|
||||
The repo ships a pre-commit hook at `scripts/pre-commit` that runs
|
||||
`cargo fmt --check`, `cargo clippy --all-targets -- -D warnings`,
|
||||
`cargo test --all-targets`, and the committed-ROM reproducibility diff.
|
||||
Install it once per worktree with:
|
||||
|
||||
```bash
|
||||
cp scripts/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit
|
||||
```
|
||||
|
||||
Do this before your first commit in a new worktree. The hook catches
|
||||
stale ROMs, stale platformer gif, and divergent bench/compile pipelines
|
||||
before they hit CI.
|
||||
|
||||
Compile every example at once:
|
||||
|
||||
```bash
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue