diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index fc104ff..fc901c4 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -282,7 +282,7 @@ jobs: # avoid the file: almost every survivor is in akbasic_audio_state_init, # where nothing asserts that a freshly initialised audio state is actually # zeroed and defaulted -- the same gap this job's own history records - # closing for src/symtab.c. Recorded in TODO.md; add the file back when it + # closing for src/symtab.c. That is issue #25; add the file back when it # is closed. # # It was 73.1% before writing this job. The run's own findings closed the @@ -297,7 +297,7 @@ jobs: # # The 21 remaining survivors are listed in the published report. Most are # ICR mutants on loop and accumulator initialisers that a stronger - # placement assertion would catch. Recorded in TODO.md. + # placement assertion would catch. Issue #25. - name: mutation testing run: | python3 scripts/mutation_test.py \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b00526..21229cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,9 +3,9 @@ cmake_minimum_required(VERSION 3.10) # libakgl both use. It flows into the library SOVERSION and nothing else spells # a version number. # -# 0.x on purpose: TODO.md section 12 records eleven defects carried over from the -# Go reference that are deliberately reproduced and not yet fixed, so the -# language surface is not being promised yet. +# 0.x on purpose: the language surface is not being promised yet. TODO.md §6 +# records the defects inherited from the Go reference and what became of each; +# the ones still open are in the issue tracker. project(akbasic VERSION 0.1.0 LANGUAGES C) # Pre-1.0 the ABI may break on a minor bump, so the soname carries MAJOR.MINOR. @@ -56,7 +56,7 @@ option(AKBASIC_SANITIZE "Build with ASan + UBSan" OFF # coverage build collides on the `coverage` target and fails to configure at all. # Rename the dependency's on the way past. Remove this once libakerror applies # the same CMAKE_SOURCE_DIR test to `coverage` that it already applies to -# `mutation` -- filed in deps/libakstdlib/TODO.md section 2.3. +# `mutation` -- filed as libakerror issue #15. # # **Only one project in a tree may shadow add_test(), and this is that project.** # CMake exposes an overridden command as `_name` and chains exactly one level: a @@ -276,7 +276,7 @@ endif() # AKBASIC_TESTS must exit 0 # AKBASIC_WILL_FAIL_TESTS abort by design # AKBASIC_KNOWN_FAILING_TESTS assert the *correct* contract for a defect -# recorded in TODO.md and are expected to fail. +# tracked as issues and are expected to fail. # When one starts passing CTest reports # "unexpectedly passed" -- that is the cue to move # it into AKBASIC_TESTS along with the fix. diff --git a/TODO.md b/TODO.md index f52a2f1..ed0f753 100644 --- a/TODO.md +++ b/TODO.md @@ -2331,7 +2331,7 @@ gitignored is exactly what makes it invisible. **Keep build trees out of the sou and if a coverage number looks suspiciously unchanged, `find . -name '*.gcda'` before believing it. -Branch coverage reads 18.0% and is not a target, for the reason `libakgl/TODO.md` and +Branch coverage reads 18.0% and is not a target, for the reason `libakgl` and `libakstdlib` both give: the akerror control-flow macros expand into large branch trees at every call site, most of them unreachable in normal operation. Track line and function coverage. diff --git a/docs/14-architecture.md b/docs/14-architecture.md index 32bea0f..721f09b 100644 --- a/docs/14-architecture.md +++ b/docs/14-architecture.md @@ -458,7 +458,7 @@ Three consequences follow, and all three are things people report as bugs: `akbasic_Value` carries its string **inline**, not behind a pointer, so a copy is a struct assignment with no allocator, no refcount and no lifetime question. It costs 256 bytes per -value; that is the trade, and it is recorded in `TODO.md`. +value; that is the trade, and it is recorded in `TODO.md` §6. Type comes from the identifier's suffix and nothing else: `A#` integer, `A%` float, `A$` string, and a bare name with no suffix is a *label*. That is `akbasic_leaf_identifier_type()`, @@ -596,7 +596,7 @@ script's mistake into an error line are wrapped around *parsing* and *interpreta not around *scanning*. A line with more than 32 tokens therefore escapes as an interpreter error — the driver prints a stack trace and exits 1, and an embedding host is handed a context for what is really a script's mistake. It is the same shape as the -`VERIFY` defect above, on a path that fix did not cover. Filed in `TODO.md`; until it is +`VERIFY` defect above, on a path that fix did not cover. That is issue #4; until it is closed, a host that cannot tolerate that should refuse over-long lines itself. ## Devices, and how a capability is withheld @@ -808,7 +808,7 @@ by name when the pointer is `NULL`**, so an older host or a different backend ge error rather than silence. If `libakgl` cannot supply what the verb needs, **do not work around it here**. File it in -`deps/libakgl/TODO.md`: what the BASIC verb requires, what the `akgl_*` entry point should +`libakgl`'s issue tracker: what the BASIC verb requires, what the `akgl_*` entry point should look like, and what tests would cover it. Four gaps have gone upstream that way and all four landed. diff --git a/include/akbasic/ui.h b/include/akbasic/ui.h index 0137ebd..2c188f4 100644 --- a/include/akbasic/ui.h +++ b/include/akbasic/ui.h @@ -57,7 +57,7 @@ * These are akgl_UiAnchor's five values and its numbering, so the adaptor maps * them across without a table. **There is deliberately no top-centre or * bottom-centre**, because libakgl has neither and this repository does not edit - * its dependencies to add one; see TODO.md. + * its dependencies to add one; see libakgl issues #79 and #80. */ typedef enum { diff --git a/include/akbasic/value.h b/include/akbasic/value.h index ba4a083..ac65b08 100644 --- a/include/akbasic/value.h +++ b/include/akbasic/value.h @@ -3,8 +3,8 @@ * @brief Declares the strongly-typed BASIC value and its operators. * * Ported from the reference's basicvalue.go. The arithmetic is reproduced - * exactly, including the parts that look wrong -- see TODO.md section 12 for the - * catalogue and the reason they are not fixed yet. + * exactly, except where a defect has since been fixed on its own merits -- see + * TODO.md §6 for the catalogue and what became of each. * * **The left operand decides whether an operation is done in integers or in * floats**, and this is deliberate rather than an oversight: every operator diff --git a/src/environment.c b/src/environment.c index 6f6e8ec..a2f57e0 100644 --- a/src/environment.c +++ b/src/environment.c @@ -172,7 +172,7 @@ akerr_ErrorContext *akbasic_environment_stop_waiting(akbasic_Environment *obj, c "NULL argument in stop_waiting"); /* * The reference ignores `command` and clears unconditionally, which lets an - * inner block clear an outer block's wait (TODO.md section 12 item 3). The + * inner block clear an outer block's wait (TODO.md §6 item 3). The * argument is honoured here only to the extent of walking to the environment * that is actually waiting for it -- clearing the wrong one outright would * change observable control flow, so the search stops at the first match and diff --git a/src/runtime.c b/src/runtime.c index 779f785..d1ff8e7 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -1056,7 +1056,7 @@ akerr_ErrorContext *akbasic_runtime_call_function(akbasic_Runtime *obj, const ch * rule.** A multi-line function called at the REPL falls straight past this * loop and returns whatever is in the caller's return slot -- zero -- so * `PRINT TRIPLE(14)` answers "(UNDEFINED STRING REPRESENTATION FOR 0)" with - * no error and no diagnostic. Recorded as TODO.md section 6 item 41. + * no error and no diagnostic. Issue #8. * * Widening it to `mode != AKBASIC_MODE_QUIT` is the obvious fix and is * *wrong*: akbasic_runtime_process_line_run() does not advance a REPL-mode diff --git a/src/runtime_commands.c b/src/runtime_commands.c index 75766e6..4294e58 100644 --- a/src/runtime_commands.c +++ b/src/runtime_commands.c @@ -617,7 +617,7 @@ akerr_ErrorContext *akbasic_cmd_dload(akbasic_Runtime *obj, akbasic_ASTLeaf *exp /* * aksl_fopen does not NULL-check pathname or mode and fopen(NULL, ...) is * undefined, so the name is validated here before it is handed over -- - * deps/libakstdlib/TODO.md 2.2.2. + * libakstdlib's UPGRADING.md. */ PASS(errctx, filename_argument(obj, expr, filename, sizeof(filename))); diff --git a/src/runtime_disk.c b/src/runtime_disk.c index 2f5e6ca..a34b2f4 100644 --- a/src/runtime_disk.c +++ b/src/runtime_disk.c @@ -389,7 +389,7 @@ akerr_ErrorContext *akbasic_cmd_directory(akbasic_Runtime *obj, akbasic_ASTLeaf * Refused rather than half-built. Listing a directory needs opendir/readdir, * which `libakstdlib` does not wrap -- and this project's rule is that a * missing capability gets filed upstream rather than worked around here - * (MAINTENANCE.md). Filed in deps/libakstdlib/TODO.md. + * (MAINTENANCE.md). Filed as libakstdlib issue #10. * * The alternative was shelling out to `ls`, which a library has no business * doing, or calling readdir directly and stepping outside the error diff --git a/src/symtab.c b/src/symtab.c index 7b7e160..1de9aa5 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -15,7 +15,7 @@ * Probe for `key`. On success *slot points at either the slot holding the key or * the first free slot it could occupy; *found says which. Uses * aksl_strhash_djb2 rather than a private hash. That wrapper sign-extends char, - * so a high-bit byte hashes wrong (deps/libakstdlib/TODO.md 1.6) -- harmless + * so a high-bit byte hashes wrong (libakstdlib's UPGRADING.md) -- harmless * here because BASIC identifiers are 7-bit ASCII, and it would only ever cost * probe efficiency, never correctness, since the key comparison is a strcmp. */