Compile a dispatch to arms, and stop dropping a long loop body
Section 24 refused a staged dispatch and named `Op::Arms` as the answer, since
its cases replace each other at one position and there is no insertion to
measure. The twin now reads `plan.arm(id, count)` -- the count rides along so a
traced render records it, because the derivation renders the site once per case
and nothing else counts them -- and `dispatched` takes the widest region any
case disagrees over, since they all sit at one place.
Every case's holes are numbered at the level around the dispatch rather than
inside a case, which is what lets one case carry a hole another does not. Same
arrangement the swap uses.
In a row, one position means one column: every case has to place its value the
same way, compared as the emitted call so it generalises past cells, and two
cases naming two columns are two cells and belong in two statements.
Also fixes a loop the derivation was dropping, found because the new refusal
fired where nothing was wrong. `grown` subtracts one body length to turn the
extra copy's earliest placement into the body's, and read it as `?`. Two copies
of the same body agree with each other, so the maximal common suffix runs back
through the extra one and lands at the start of the markup BEFORE the loop --
earlier than one body length whenever the body is longer than that markup, which
is any table whose rows are longer than its heading row. It underflowed, the
loop was dropped, and the residual held one pass as a literal with a `Repeat`
still in the fill program to panic on the first request. There is no window in
that case rather than no span.
Every screen on the seam had a preamble longer than its rows, which is why
nothing had hit it.
quasicoherent cbb63155.
- Co-Authored-By
- Claude Opus 5 (1M context) <noreply@anthropic.com>
- Claude-Session
- https://claude.ai/code/session_01P8ostB2UmZJGj5WjSHRSot
19 files changed,
+568 insertions,
-59 deletions
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-axum"
|
| 3 |
|
- |
version = "0.107.0"
|
|
3 |
+ |
version = "0.108.0"
|
| 4 |
4 |
|
description = "The axum host adapter for quasi-router: an HTTP request in, a rendered description out"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 13 |
13 |
|
workspace = true
|
| 14 |
14 |
|
|
| 15 |
15 |
|
[dependencies]
|
| 16 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
| 17 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.107" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.108" }
|
|
17 |
+ |
quasi-http = { path = "../quasi-http", version = "0.108" }
|
| 18 |
18 |
|
axum = "0.8.8"
|
| 19 |
19 |
|
http = "1.3.1"
|
| 20 |
20 |
|
tokio = { version = "1.50.0", features = ["rt"] }
|
| 21 |
21 |
|
|
| 22 |
22 |
|
[dev-dependencies]
|
| 23 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.107" }
|
|
23 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.108" }
|
| 24 |
24 |
|
tokio = { version = "1.50.0", features = ["macros", "rt-multi-thread"] }
|
| 25 |
25 |
|
tower = { version = "0.5.3", features = ["util"] }
|
| 26 |
26 |
|
http-body-util = "0.1.3"
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-basics"
|
| 3 |
|
- |
version = "0.107.0"
|
|
3 |
+ |
version = "0.108.0"
|
| 4 |
4 |
|
description = "The first-party widget set: named assemblies of primitives, shared across our apps"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 13 |
13 |
|
workspace = true
|
| 14 |
14 |
|
|
| 15 |
15 |
|
[dependencies]
|
| 16 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.108" }
|
| 17 |
17 |
|
quasi-declare = { path = "../quasi-declare", version = "0.1" }
|
| 18 |
18 |
|
makeover-layout = "0.44"
|
| 19 |
19 |
|
|
| 21 |
21 |
|
# A widget's guarantees are claims about what a renderer draws, so they are
|
| 22 |
22 |
|
# tested against a real one rather than by walking the tree the assembly just
|
| 23 |
23 |
|
# built. The webview is the renderer that recognises names today.
|
| 24 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.107" }
|
| 25 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.107" }
|
|
24 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.108" }
|
|
25 |
+ |
quasi-http = { path = "../quasi-http", version = "0.108" }
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-bench"
|
| 3 |
|
- |
version = "0.107.0"
|
|
3 |
+ |
version = "0.108.0"
|
| 4 |
4 |
|
description = "What a described screen costs to render, in time and in allocations"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 26 |
26 |
|
askama = ["dep:askama"]
|
| 27 |
27 |
|
|
| 28 |
28 |
|
[dependencies]
|
| 29 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
| 30 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.107" }
|
| 31 |
|
- |
quasi-tui = { path = "../quasi-tui", version = "0.107" }
|
| 32 |
|
- |
quasi-immediate = { path = "../quasi-immediate", version = "0.107" }
|
|
29 |
+ |
quasi-router = { path = "../quasi-router", version = "0.108" }
|
|
30 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.108" }
|
|
31 |
+ |
quasi-tui = { path = "../quasi-tui", version = "0.108" }
|
|
32 |
+ |
quasi-immediate = { path = "../quasi-immediate", version = "0.108" }
|
| 33 |
33 |
|
# `Serves` is the trait carrying `screen` and `fragment`, which is what the
|
| 34 |
34 |
|
# webview is measured through. Taken directly rather than through quasi-webview
|
| 35 |
35 |
|
# because a bench calling a trait method should name the trait it calls.
|
| 36 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.107" }
|
|
36 |
+ |
quasi-http = { path = "../quasi-http", version = "0.108" }
|
| 37 |
37 |
|
# The macro under measurement. The bench holds the declared copy of the same
|
| 38 |
38 |
|
# screen `staging.rs` writes by hand, so the staged column measures what the
|
| 39 |
39 |
|
# server actually serves rather than a shape written for a benchmark.
|
| 31 |
31 |
|
trybuild = "1"
|
| 32 |
32 |
|
# The generated code names the vocabulary, so a case that is meant to COMPILE
|
| 33 |
33 |
|
# needs it. A proc-macro crate cannot depend on it outside dev.
|
| 34 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
|
34 |
+ |
quasi-router = { path = "../quasi-router", version = "0.108" }
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-http"
|
| 3 |
|
- |
version = "0.107.0"
|
|
3 |
+ |
version = "0.108.0"
|
| 4 |
4 |
|
description = "The http-shaped seam quasi's webview host adapters share: decoding in, a rendered description out"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 13 |
13 |
|
workspace = true
|
| 14 |
14 |
|
|
| 15 |
15 |
|
[dependencies]
|
| 16 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.107" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.108" }
|
| 17 |
17 |
|
http = "1.3.1"
|
| 18 |
18 |
|
form_urlencoded = "1.2.2"
|