Compare commits
1 Commits
18b30b753b
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
c5d13f00f6
|
@@ -282,7 +282,7 @@ jobs:
|
|||||||
# avoid the file: almost every survivor is in akbasic_audio_state_init,
|
# avoid the file: almost every survivor is in akbasic_audio_state_init,
|
||||||
# where nothing asserts that a freshly initialised audio state is actually
|
# where nothing asserts that a freshly initialised audio state is actually
|
||||||
# zeroed and defaulted -- the same gap this job's own history records
|
# 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.
|
# is closed.
|
||||||
#
|
#
|
||||||
# It was 73.1% before writing this job. The run's own findings closed the
|
# 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
|
# The 21 remaining survivors are listed in the published report. Most are
|
||||||
# ICR mutants on loop and accumulator initialisers that a stronger
|
# 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
|
- name: mutation testing
|
||||||
run: |
|
run: |
|
||||||
python3 scripts/mutation_test.py \
|
python3 scripts/mutation_test.py \
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ cmake_minimum_required(VERSION 3.10)
|
|||||||
# libakgl both use. It flows into the library SOVERSION and nothing else spells
|
# libakgl both use. It flows into the library SOVERSION and nothing else spells
|
||||||
# a version number.
|
# a version number.
|
||||||
#
|
#
|
||||||
# 0.x on purpose: TODO.md section 12 records eleven defects carried over from the
|
# 0.x on purpose: the language surface is not being promised yet. TODO.md §6
|
||||||
# Go reference that are deliberately reproduced and not yet fixed, so the
|
# records the defects inherited from the Go reference and what became of each;
|
||||||
# language surface is not being promised yet.
|
# the ones still open are in the issue tracker.
|
||||||
project(akbasic VERSION 0.1.0 LANGUAGES C)
|
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.
|
# 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.
|
# 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
|
# 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
|
# 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.**
|
# **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
|
# CMake exposes an overridden command as `_name` and chains exactly one level: a
|
||||||
@@ -276,7 +276,7 @@ endif()
|
|||||||
# AKBASIC_TESTS must exit 0
|
# AKBASIC_TESTS must exit 0
|
||||||
# AKBASIC_WILL_FAIL_TESTS abort by design
|
# AKBASIC_WILL_FAIL_TESTS abort by design
|
||||||
# AKBASIC_KNOWN_FAILING_TESTS assert the *correct* contract for a defect
|
# 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
|
# When one starts passing CTest reports
|
||||||
# "unexpectedly passed" -- that is the cue to move
|
# "unexpectedly passed" -- that is the cue to move
|
||||||
# it into AKBASIC_TESTS along with the fix.
|
# it into AKBASIC_TESTS along with the fix.
|
||||||
|
|||||||
2
TODO.md
2
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
|
and if a coverage number looks suspiciously unchanged, `find . -name '*.gcda'` before believing
|
||||||
it.
|
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
|
`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
|
at every call site, most of them unreachable in normal operation. Track line and function
|
||||||
coverage.
|
coverage.
|
||||||
|
|||||||
@@ -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
|
`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
|
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$`
|
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()`,
|
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
|
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
|
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
|
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.
|
closed, a host that cannot tolerate that should refuse over-long lines itself.
|
||||||
|
|
||||||
## Devices, and how a capability is withheld
|
## 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.
|
error rather than silence.
|
||||||
|
|
||||||
If `libakgl` cannot supply what the verb needs, **do not work around it here**. File it in
|
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
|
look like, and what tests would cover it. Four gaps have gone upstream that way and all
|
||||||
four landed.
|
four landed.
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
* These are akgl_UiAnchor's five values and its numbering, so the adaptor maps
|
* 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
|
* them across without a table. **There is deliberately no top-centre or
|
||||||
* bottom-centre**, because libakgl has neither and this repository does not edit
|
* 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
|
typedef enum
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
* @brief Declares the strongly-typed BASIC value and its operators.
|
* @brief Declares the strongly-typed BASIC value and its operators.
|
||||||
*
|
*
|
||||||
* Ported from the reference's basicvalue.go. The arithmetic is reproduced
|
* 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
|
* exactly, except where a defect has since been fixed on its own merits -- see
|
||||||
* catalogue and the reason they are not fixed yet.
|
* TODO.md §6 for the catalogue and what became of each.
|
||||||
*
|
*
|
||||||
* **The left operand decides whether an operation is done in integers or in
|
* **The left operand decides whether an operation is done in integers or in
|
||||||
* floats**, and this is deliberate rather than an oversight: every operator
|
* floats**, and this is deliberate rather than an oversight: every operator
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ akerr_ErrorContext *akbasic_environment_stop_waiting(akbasic_Environment *obj, c
|
|||||||
"NULL argument in stop_waiting");
|
"NULL argument in stop_waiting");
|
||||||
/*
|
/*
|
||||||
* The reference ignores `command` and clears unconditionally, which lets an
|
* 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
|
* 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
|
* 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
|
* change observable control flow, so the search stops at the first match and
|
||||||
|
|||||||
@@ -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
|
* 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
|
* loop and returns whatever is in the caller's return slot -- zero -- so
|
||||||
* `PRINT TRIPLE(14)` answers "(UNDEFINED STRING REPRESENTATION FOR 0)" with
|
* `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
|
* 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
|
* *wrong*: akbasic_runtime_process_line_run() does not advance a REPL-mode
|
||||||
|
|||||||
@@ -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
|
* 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 --
|
* 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)));
|
PASS(errctx, filename_argument(obj, expr, filename, sizeof(filename)));
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
* Refused rather than half-built. Listing a directory needs opendir/readdir,
|
||||||
* which `libakstdlib` does not wrap -- and this project's rule is that a
|
* which `libakstdlib` does not wrap -- and this project's rule is that a
|
||||||
* missing capability gets filed upstream rather than worked around here
|
* 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
|
* The alternative was shelling out to `ls`, which a library has no business
|
||||||
* doing, or calling readdir directly and stepping outside the error
|
* doing, or calling readdir directly and stepping outside the error
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
* Probe for `key`. On success *slot points at either the slot holding the key or
|
* 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
|
* the first free slot it could occupy; *found says which. Uses
|
||||||
* aksl_strhash_djb2 rather than a private hash. That wrapper sign-extends char,
|
* 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
|
* 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.
|
* probe efficiency, never correctness, since the key comparison is a strcmp.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user