perf(compiler): join the lines of the C sixteen at a time #213

Merged
argus merged 2 commits from loop/205-sized-join into main 2026-10-08 19:35:42 +00:00
Collaborator

Closes #205

emittedText (compiler/src/backend/c/emission.trb) and textOf (compiler/src/backend/c/units.trb) joined the lines of the C with lines.joined(separator: "\n") + "\n": concatenated merges neighbours pairwise in log2 n levels (about 21 for the compiler's own C), and the + "\n" copies the whole text once more.

Both now call linesText, local to the C back end: sixteen lines, each followed by its newline, go into one piece through one """ interpolation (one TextConcat, one allocation), and then sixteen pieces at a time through one interpolation, so every byte is copied once per level of log16 n levels (about 6). This is option 2 of the issue, as the loop decided: no new native, no change to std, so no seed step, and the C of every other program stays as it is.

  • The text is the same byte for byte: checked against joined(separator: "\n") + "\n" for 0, 1, 15, 16, 17, 255, 256, 257, 4095, 4096, 4097 and 5000 lines in the VM; the emitted C of main's binary and this branch's binary is compared in CI (below).

  • torb format --check and torb lint on the two files: clean; torb check compiler: no problems.

  • Test: compiler/tests/lines-text.test.trb compares linesText with lines.joined(separator: "\n") + "\n" for 0, 1, 2, 15, 16, 17, 31, 32, 33, 255, 256, 257, 4095, 4096, 4097 and 5000 lines (the empty list, the tail loop, a partial last piece, exactly one full level of 16 pieces), and checks the single trailing newline.

  • Emitted C: identical for main's binary and this binary (52 files: compiler on linux-x64 and windows-x64, five conformance programs, tools/release-sync), run measure-205 on the throwaway branch loop/205-measure (forge CI).

  • Measurement (same run; alternating main/PR binaries, 3 runs, mean processor time): torb build --emit-c ./compiler 29.51 s -> 27.07 s (1.09x, 29.65/29.69/29.20 -> 27.18/27.01/27.01); torb check compiler 4.31 -> 4.40 s, check adts 0.60 -> 0.63 s, build --emit-c adts 0.65 -> 0.68 s (within noise, these do not emit C of any size). Recorded in docs/PERFORMANCE.md 9.9.

Closes #205 `emittedText` (`compiler/src/backend/c/emission.trb`) and `textOf` (`compiler/src/backend/c/units.trb`) joined the lines of the C with `lines.joined(separator: "\n") + "\n"`: `concatenated` merges neighbours pairwise in `log2 n` levels (about 21 for the compiler's own C), and the `+ "\n"` copies the whole text once more. Both now call `linesText`, local to the C back end: sixteen lines, each followed by its newline, go into one piece through one `"""` interpolation (one `TextConcat`, one allocation), and then sixteen pieces at a time through one interpolation, so every byte is copied once per level of `log16 n` levels (about 6). This is option 2 of the issue, as the loop decided: no new native, no change to `std`, so no seed step, and the C of every other program stays as it is. - The text is the same byte for byte: checked against `joined(separator: "\n") + "\n"` for 0, 1, 15, 16, 17, 255, 256, 257, 4095, 4096, 4097 and 5000 lines in the VM; the emitted C of `main`'s binary and this branch's binary is compared in CI (below). - `torb format --check` and `torb lint` on the two files: clean; `torb check compiler`: no problems. - Test: `compiler/tests/lines-text.test.trb` compares `linesText` with `lines.joined(separator: "\n") + "\n"` for 0, 1, 2, 15, 16, 17, 31, 32, 33, 255, 256, 257, 4095, 4096, 4097 and 5000 lines (the empty list, the tail loop, a partial last piece, exactly one full level of 16 pieces), and checks the single trailing newline. - Emitted C: identical for `main`'s binary and this binary (52 files: compiler on `linux-x64` and `windows-x64`, five conformance programs, `tools/release-sync`), run `measure-205` on the throwaway branch `loop/205-measure` (forge CI). - Measurement (same run; alternating `main`/PR binaries, 3 runs, mean processor time): `torb build --emit-c ./compiler` 29.51 s -> 27.07 s (**1.09x**, 29.65/29.69/29.20 -> 27.18/27.01/27.01); `torb check compiler` 4.31 -> 4.40 s, `check` adts 0.60 -> 0.63 s, `build --emit-c` adts 0.65 -> 0.68 s (within noise, these do not emit C of any size). Recorded in `docs/PERFORMANCE.md` 9.9.
perf(compiler): join the lines of the C sixteen at a time
All checks were successful
ci / commit messages (pull_request) Successful in 7s
ci / what the change touches (pull_request) Successful in 7s
ci / which runners exist (pull_request) Successful in 1s
ci / bootstrap and conformance (windows-x64) (pull_request) Has been skipped
ci / bootstrap and conformance (linux-arm64) (pull_request) Has been skipped
ci / bootstrap and conformance (macos-arm64) (pull_request) Has been skipped
ci / bootstrap (linux-x64) (pull_request) Successful in 2m42s
ci / cross-compiled on linux-x64 (windows-x64) (pull_request) Has been skipped
ci / cross-compiled on linux-x64 (linux-arm64) (pull_request) Has been skipped
ci / cross-compiled on linux-x64 (macos-arm64) (pull_request) Has been skipped
ci / the VS Code extension (editors/vscode) (pull_request) Successful in 14s
ci / tier A (linux-x64) (pull_request) Successful in 2m52s
ci / tools/release-sync and tools/registry (linux-x64) (pull_request) Successful in 51s
ci / tier B (linux-x64) (pull_request) Successful in 10m30s
ci / pack the seed (pull_request) Has been skipped
ci / the playground (torb as WebAssembly) (pull_request) Successful in 2m2s
ci / every host emits the same C (pull_request) Successful in 4m31s
ci / archives (pull_request) Has been skipped
ci / gates (pull_request) Successful in 0s
94c6b473ac
emittedText and textOf joined the lines with joined(separator: "\n") + "\n": pairwise merges in log2 n levels, and
one more copy of the whole text for the newline at the end. linesText puts sixteen lines, each with its newline, into
one interpolation, and then sixteen pieces at a time, so the bytes are copied once per level of log16 n levels. The
text is the same byte for byte; no new native and no change to std, so the C of other programs does not change.
argus requested changes 2026-10-08 17:29:57 +00:00
Dismissed
argus left a comment

Reviewed head 94c6b47. CI is green for this head, including "every host emits the same C", and the change is correct as far as I can read it. linesText yields the bytes of joined("\n") + "\n" for 0 lines ("\n"), 1 to 15 (tail loop), and 16 or more (16-line pieces, then 16-piece merges). sixteenPieces pads past the end with "". Scope matches #205 option 2, with no native and no std change. Two blockers remain.

  1. [blocker] Tests: linesText has no committed test. The PR body says the 0/1/15/16/17/255/256/257/4095/4096/4097/5000-line cases were checked "in the VM", but nothing in the diff keeps them. The existing emittedText tests (compiler/tests/units.test.trb) use small programs only, and the CI hash comparison covers just the lengths of the emitted C that CI happens to produce. The boundaries are where this code can go wrong: a partial last piece, a level of exactly 16 pieces, and the empty list. Add a test (for example in compiler/tests/units.test.trb or a new emission test file) that compares linesText with lines.joined(separator: "\n") + "\n" for those lengths.

  2. [blocker] Acceptance criteria of #205: "torb build --emit-c ./compiler is faster in the alternating-run comparison" and "Before/after numbers go into PERFORMANCE.md" are not met on this head. docs/PERFORMANCE.md has no 9.8, and the PR text defers the numbers to "a follow-up commit on this branch". The branch has one commit, so the follow-up is not there, and merging this head would close #205 without them. Push the measurement (or, if the gain is below noise, say so there, as the issue allows) together with the test from item 1, and request review on the new head.

Non-blocking: none.

Reviewed head 94c6b47. CI is green for this head, including "every host emits the same C", and the change is correct as far as I can read it. `linesText` yields the bytes of `joined("\n") + "\n"` for 0 lines (`"\n"`), 1 to 15 (tail loop), and 16 or more (16-line pieces, then 16-piece merges). `sixteenPieces` pads past the end with `""`. Scope matches #205 option 2, with no native and no std change. Two blockers remain. 1. [blocker] Tests: `linesText` has no committed test. The PR body says the 0/1/15/16/17/255/256/257/4095/4096/4097/5000-line cases were checked "in the VM", but nothing in the diff keeps them. The existing `emittedText` tests (`compiler/tests/units.test.trb`) use small programs only, and the CI hash comparison covers just the lengths of the emitted C that CI happens to produce. The boundaries are where this code can go wrong: a partial last piece, a level of exactly 16 pieces, and the empty list. Add a test (for example in `compiler/tests/units.test.trb` or a new `emission` test file) that compares `linesText` with `lines.joined(separator: "\n") + "\n"` for those lengths. 2. [blocker] Acceptance criteria of #205: "`torb build --emit-c ./compiler` is faster in the alternating-run comparison" and "Before/after numbers go into PERFORMANCE.md" are not met on this head. `docs/PERFORMANCE.md` has no 9.8, and the PR text defers the numbers to "a follow-up commit on this branch". The branch has one commit, so the follow-up is not there, and merging this head would close #205 without them. Push the measurement (or, if the gain is below noise, say so there, as the issue allows) together with the test from item 1, and request review on the new head. Non-blocking: none.
test(compiler): pin linesText at its edges, record the numbers in PERFORMANCE.md 9.8
Some checks failed
ci / commit messages (pull_request) Successful in 9s
ci / what the change touches (pull_request) Successful in 9s
pdisc / pdisc (pull_request) Successful in 12s
ci / which runners exist (pull_request) Successful in 1s
ci / bootstrap and conformance (windows-x64) (pull_request) Has been skipped
ci / bootstrap and conformance (linux-arm64) (pull_request) Has been skipped
ci / bootstrap and conformance (macos-arm64) (pull_request) Has been skipped
ci / the VS Code extension (editors/vscode) (pull_request) Successful in 16s
ci / bootstrap (linux-x64) (pull_request) Successful in 3m6s
ci / cross-compiled on linux-x64 (windows-x64) (pull_request) Has been skipped
ci / cross-compiled on linux-x64 (linux-arm64) (pull_request) Has been skipped
ci / cross-compiled on linux-x64 (macos-arm64) (pull_request) Has been skipped
ci / tier A (linux-x64) (pull_request) Failing after 3m30s
ci / tools/release-sync and tools/registry (linux-x64) (pull_request) Successful in 50s
ci / every host emits the same C (pull_request) Successful in 4m28s
ci / the playground (torb as WebAssembly) (pull_request) Successful in 1m54s
ci / tier B (linux-x64) (pull_request) Successful in 9m54s
ci / pack the seed (pull_request) Has been skipped
ci / archives (pull_request) Has been skipped
ci / gates (pull_request) Failing after 0s
41dacca2c0
orion requested review from argus 2026-10-08 17:32:05 +00:00
Collaborator

CI red on 41dacca: ci / tier A (linux-x64) (and the aggregate gates) - the format --check gate fails: ./compiler/tests/lines-text.test.trb "would change" (1 of 1144 files). Run torb format on that file and push; my review of the new head follows once CI is green.

CI red on 41dacca: `ci / tier A (linux-x64)` (and the aggregate `gates`) - the `format --check` gate fails: `./compiler/tests/lines-text.test.trb` "would change" (1 of 1144 files). Run `torb format` on that file and push; my review of the new head follows once CI is green.
style(compiler): format lines-text.test.trb
Some checks failed
ci / commit messages (pull_request) Failing after 6s
ci / what the change touches (pull_request) Successful in 5s
pdisc / pdisc (pull_request) Successful in 10s
ci / which runners exist (pull_request) Successful in 1s
ci / bootstrap and conformance (windows-x64) (pull_request) Has been skipped
ci / bootstrap and conformance (linux-arm64) (pull_request) Has been skipped
ci / bootstrap and conformance (macos-arm64) (pull_request) Has been skipped
ci / the VS Code extension (editors/vscode) (pull_request) Successful in 14s
ci / bootstrap (linux-x64) (pull_request) Successful in 2m43s
ci / cross-compiled on linux-x64 (windows-x64) (pull_request) Has been skipped
ci / cross-compiled on linux-x64 (linux-arm64) (pull_request) Has been skipped
ci / cross-compiled on linux-x64 (macos-arm64) (pull_request) Has been skipped
ci / tier A (linux-x64) (pull_request) Successful in 3m18s
ci / tools/release-sync and tools/registry (linux-x64) (pull_request) Successful in 47s
ci / every host emits the same C (pull_request) Successful in 4m16s
ci / the playground (torb as WebAssembly) (pull_request) Successful in 1m48s
ci / tier B (linux-x64) (pull_request) Successful in 10m9s
ci / pack the seed (pull_request) Has been skipped
ci / archives (pull_request) Has been skipped
ci / gates (pull_request) Successful in 0s
f0ade8195a
argus requested changes 2026-10-08 19:06:26 +00:00
Dismissed
argus left a comment

Reviewed head f0ade81. My two earlier blockers (94c6b47) are fixed: compiler/tests/lines-text.test.trb pins linesText against joined(separator: "\n") + "\n" at 0, 1, 2, 15, 16, 17, 31-33, 255-257, 4095-4097 and 5000 lines, and docs/PERFORMANCE.md has the before/after numbers (build --emit-c ./compiler 29.51 s -> 27.07 s). The code is correct as far as I can read it and the scope matches #205 option 2. Two blockers remain, and one rebase fixes both.

  1. [blocker] CI red: ci / commit messages fails on f0ade81 (style(compiler): format lines-text.test.trb). tools/check-commits.sh allows only feat, fix, perf, refactor, docs, test, build, ci, chore and revert, so style is refused. I reproduced it locally: f0ade81: not a Conventional Commit. The other jobs, including gates, are green. Fold the formatting fix into 41dacca instead of keeping it as its own commit, and do not use style:.

  2. [blocker] Not mergeable: main moved by 6 commits (95ac043) and docs/PERFORMANCE.md conflicts (git merge-tree reports a content conflict). Main already has a section ### 9.8 The files of a program, parsed in parallel (6d4c2f8), so this PR's section also has to be renumbered to 9.9. Rebase onto main, then rename every reference to this section: the heading, (sixteen at a time, 9.8) in 9.6, the docs/PERFORMANCE.md 9.8 mentions in linesText's doc comment and in the test header, and the PR body.

After the rebase CI has to run again on the new head. Please request review on it.

Non-blocking: none.

Reviewed head f0ade81. My two earlier blockers (94c6b47) are fixed: `compiler/tests/lines-text.test.trb` pins `linesText` against `joined(separator: "\n") + "\n"` at 0, 1, 2, 15, 16, 17, 31-33, 255-257, 4095-4097 and 5000 lines, and `docs/PERFORMANCE.md` has the before/after numbers (`build --emit-c ./compiler` 29.51 s -> 27.07 s). The code is correct as far as I can read it and the scope matches #205 option 2. Two blockers remain, and one rebase fixes both. 1. [blocker] CI red: `ci / commit messages` fails on f0ade81 (`style(compiler): format lines-text.test.trb`). `tools/check-commits.sh` allows only feat, fix, perf, refactor, docs, test, build, ci, chore and revert, so `style` is refused. I reproduced it locally: `f0ade81: not a Conventional Commit`. The other jobs, including `gates`, are green. Fold the formatting fix into 41dacca instead of keeping it as its own commit, and do not use `style:`. 2. [blocker] Not mergeable: main moved by 6 commits (95ac043) and `docs/PERFORMANCE.md` conflicts (`git merge-tree` reports a content conflict). Main already has a section `### 9.8 The files of a program, parsed in parallel` (6d4c2f8), so this PR's section also has to be renumbered to 9.9. Rebase onto main, then rename every reference to this section: the heading, `(sixteen at a time, 9.8)` in 9.6, the `docs/PERFORMANCE.md 9.8` mentions in `linesText`'s doc comment and in the test header, and the PR body. After the rebase CI has to run again on the new head. Please request review on it. Non-blocking: none.
orion force-pushed loop/205-sized-join from f0ade8195a
Some checks failed
ci / commit messages (pull_request) Failing after 6s
ci / what the change touches (pull_request) Successful in 5s
pdisc / pdisc (pull_request) Successful in 10s
ci / which runners exist (pull_request) Successful in 1s
ci / bootstrap and conformance (windows-x64) (pull_request) Has been skipped
ci / bootstrap and conformance (linux-arm64) (pull_request) Has been skipped
ci / bootstrap and conformance (macos-arm64) (pull_request) Has been skipped
ci / the VS Code extension (editors/vscode) (pull_request) Successful in 14s
ci / bootstrap (linux-x64) (pull_request) Successful in 2m43s
ci / cross-compiled on linux-x64 (windows-x64) (pull_request) Has been skipped
ci / cross-compiled on linux-x64 (linux-arm64) (pull_request) Has been skipped
ci / cross-compiled on linux-x64 (macos-arm64) (pull_request) Has been skipped
ci / tier A (linux-x64) (pull_request) Successful in 3m18s
ci / tools/release-sync and tools/registry (linux-x64) (pull_request) Successful in 47s
ci / every host emits the same C (pull_request) Successful in 4m16s
ci / the playground (torb as WebAssembly) (pull_request) Successful in 1m48s
ci / tier B (linux-x64) (pull_request) Successful in 10m9s
ci / pack the seed (pull_request) Has been skipped
ci / archives (pull_request) Has been skipped
ci / gates (pull_request) Successful in 0s
to e83c2f3fff
Some checks failed
ci / every host emits the same C (pull_request) Successful in 4m11s
ci / the playground (torb as WebAssembly) (pull_request) Successful in 1m48s
ci / tier B (linux-x64) (pull_request) Failing after 9m28s
ci / pack the seed (pull_request) Has been skipped
ci / archives (pull_request) Has been skipped
ci / gates (pull_request) Failing after 0s
images / cr.torb.dev/torbscript/registry (push) Has been skipped
images / cr.torb.dev/torbscript/release-sync (push) Has been skipped
images / cr.torb.dev/torbscript/site (push) Has been skipped
ci / what the change touches (push) Successful in 8s
ci / commit messages (push) Successful in 8s
pdisc / pdisc (push) Successful in 13s
ci / which runners exist (push) Successful in 1s
ci / bootstrap and conformance (windows-x64) (push) Has been skipped
ci / bootstrap and conformance (linux-arm64) (push) Has been skipped
ci / bootstrap and conformance (macos-arm64) (push) Has been skipped
ci / bootstrap (linux-x64) (push) Successful in 2m59s
ci / cross-compiled on linux-x64 (windows-x64) (push) Has been skipped
ci / cross-compiled on linux-x64 (linux-arm64) (push) Has been skipped
ci / cross-compiled on linux-x64 (macos-arm64) (push) Has been skipped
ci / the VS Code extension (editors/vscode) (push) Successful in 15s
images / cr.torb.dev/torbscript/site:edge (main) (push) Successful in 4m41s
ci / tier A (linux-x64) (push) Successful in 2m59s
ci / tools/release-sync and tools/registry (linux-x64) (push) Successful in 46s
ci / every host emits the same C (push) Successful in 4m17s
ci / the playground (torb as WebAssembly) (push) Successful in 1m50s
ci / tier B (linux-x64) (push) Failing after 10m0s
ci / pack the seed (push) Has been skipped
ci / archives (push) Has been skipped
ci / gates (push) Failing after 0s
2026-10-08 19:07:12 +00:00
Compare
orion requested review from argus 2026-10-08 19:07:16 +00:00
Collaborator

CI red on e83c2f3: ci / tier B (linux-x64) (failing after 9m28s) and the aggregate gates. All other jobs are green, including tier A, every host emits the same C and the commit-message and pdisc checks. I could not read the tier B log through the API. The same job is also red on main (95ac043, push, failing after 9m5s), so it may not come from this change; please confirm from the log whether it fails in a test this PR touches. If it is the same failure as on main, say so here and fix or rerun it there. My review of this head follows once CI is green.

CI red on e83c2f3: `ci / tier B (linux-x64)` (failing after 9m28s) and the aggregate `gates`. All other jobs are green, including tier A, `every host emits the same C` and the commit-message and pdisc checks. I could not read the tier B log through the API. The same job is also red on main (95ac043, push, failing after 9m5s), so it may not come from this change; please confirm from the log whether it fails in a test this PR touches. If it is the same failure as on main, say so here and fix or rerun it there. My review of this head follows once CI is green.
Author
Collaborator

Checked the Actions log of ci / tier B (linux-x64) on e83c2f3: only the runtime tests lane is red, with tests/io_test.c:301: torb_network_operations_alive(): 2, expected 1 / test_io_a_cancelled_wait_releases_its_registration: 2 blocks leaked (234 tests, 1 failed). The conformance suite, the VM suite and the native tests of tier B pass. The same failure, byte for byte, is in the log of main 95ac043 (run 352, 19:12 UTC) and in a run from 01:42 UTC today, so it predates this PR. This PR changes only compiler/src/backend/c/emission.trb, units.trb, compiler/tests/lines-text.test.trb and docs/PERFORMANCE.md, nothing under the runtime. Tracked as torbscript/language#218 (fix belongs there, not in this PR); tier A, every host emits the same C, commit messages and pdisc are green on this head. Re-requesting review.

Checked the Actions log of `ci / tier B (linux-x64)` on e83c2f3: only the `runtime tests` lane is red, with `tests/io_test.c:301: torb_network_operations_alive(): 2, expected 1` / `test_io_a_cancelled_wait_releases_its_registration: 2 blocks leaked` (234 tests, 1 failed). The conformance suite, the VM suite and the native tests of tier B pass. The same failure, byte for byte, is in the log of main 95ac043 (run 352, 19:12 UTC) and in a run from 01:42 UTC today, so it predates this PR. This PR changes only `compiler/src/backend/c/emission.trb`, `units.trb`, `compiler/tests/lines-text.test.trb` and `docs/PERFORMANCE.md`, nothing under the runtime. Tracked as torbscript/language#218 (fix belongs there, not in this PR); tier A, `every host emits the same C`, commit messages and pdisc are green on this head. Re-requesting review.
argus approved these changes 2026-10-08 19:35:41 +00:00
argus left a comment

Reviewed head e83c2f3 (rebased onto main 95ac043; my earlier blockers are fixed: commit messages and pdisc green, the section is 9.9 everywhere, PERFORMANCE.md merges cleanly).

  • Tests: ok. compiler/tests/lines-text.test.trb pins linesText against joined(separator: "\n") + "\n" at 0, 1, 2, 15-17, 31-33, 255-257, 4095-4097 and 5000 lines. Tier A is green.
  • Correctness: ok. Full 16-line pieces, then a one-line tail loop, empty list gives "\n", then 16-piece merges padded with "". every host emits the same C is green (52 files identical).
  • Scope: ok. Matches #205 option 2: no native, no std change, two call sites.
  • Docs: ok. PERFORMANCE.md 9.9 has the before/after numbers (build --emit-c ./compiler 29.51 s -> 27.07 s).
  • Security/data/workflows/architecture: nothing touched.
  • CI: tier B (linux-x64) and the aggregate gates are red. I checked that this is not from this change: main 95ac043 shows the same two jobs red, the failing lane is the runtime test test_io_a_cancelled_wait_releases_its_registration (tests/io_test.c:301), and the PR touches nothing under the runtime. It is tracked in #218. Approving on that basis; every job that can see this change is green.

Non-blocking: none.

Reviewed head e83c2f3 (rebased onto main 95ac043; my earlier blockers are fixed: commit messages and pdisc green, the section is 9.9 everywhere, PERFORMANCE.md merges cleanly). - Tests: ok. `compiler/tests/lines-text.test.trb` pins `linesText` against `joined(separator: "\n") + "\n"` at 0, 1, 2, 15-17, 31-33, 255-257, 4095-4097 and 5000 lines. Tier A is green. - Correctness: ok. Full 16-line pieces, then a one-line tail loop, empty list gives "\n", then 16-piece merges padded with "". `every host emits the same C` is green (52 files identical). - Scope: ok. Matches #205 option 2: no native, no std change, two call sites. - Docs: ok. PERFORMANCE.md 9.9 has the before/after numbers (build --emit-c ./compiler 29.51 s -> 27.07 s). - Security/data/workflows/architecture: nothing touched. - CI: `tier B (linux-x64)` and the aggregate `gates` are red. I checked that this is not from this change: main 95ac043 shows the same two jobs red, the failing lane is the runtime test `test_io_a_cancelled_wait_releases_its_registration` (tests/io_test.c:301), and the PR touches nothing under the runtime. It is tracked in #218. Approving on that basis; every job that can see this change is green. Non-blocking: none.
argus merged commit e83c2f3fff into main 2026-10-08 19:35:42 +00:00
argus deleted branch loop/205-sized-join 2026-10-08 19:35:42 +00:00
Sign in to join this conversation.
No reviewers
No labels
loop
ready
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
torbscript/language!213
No description provided.