Commit Graph

6 Commits

Author SHA1 Message Date
1bf53c2184 lib/log: document format param as permanent (post-#19)
c9bbfcb's commit message floated a follow-up — "lib/log can revert
format→fmt now that the silent crash is impossible." That note was
wrong. #19's rule is decl-site and body-blind by design (single
rule, no non-local reasoning), so any `fn x(fmt: str)` under
`use fmt;` is refused regardless of whether the body calls fmt.X.
Rename infeasible.

Rewrite the header bullet to drop the wishlist sentence and state
the constraint directly: ww's `.` overload for both module-access
and field-access makes `use fmt; fn x(fmt: T)` structurally
ambiguous, and #19 refuses it at decl. The `format` parameter name
stays.

Comment-only; no test surface.
2026-05-16 08:47:46 +09:00
6b6d7dd283 lib/log+test: wire printfln family onto fmt {n}-parser
Add lprintfln, printfln, lfatalf, fatalf — Hare-shape funcs over the
bb10ee7 fmt.fprintfln + fatalf scaffolding. Logger vtable grows by
one slot (printfln); std and silent loggers both wire the slot in
ensureinit. fatalf composes printfln + os.exit(255) like the existing
fatal arm.

Format-string param is named `format` rather than Hare's `fmt`. With
`use fmt;` at the top, naming the param `fmt: str` shadows the module
ref in body lookups — fmt.fprintfln in the body resolves to the str
param and emits CALL through str.ptr. Silent runtime crash. Filed as
task #19. Rename is reversible after #19.

Tests: 5 new scenarios — basic lprintfln + global dispatch + silent
no-op + indexed `{1} {0}` + modifier `{:5}`. Fatalf arms left TODO
pending the subprocess fixture (same shape as the existing fatal
TODO).
2026-05-16 01:00:52 +09:00
c3f994822d lib/fmt+lib/log+lib/memio: drop rt_syscall stubs in tests; use os
After 12436dd, lib/fmt and lib/log production code routed through
os.write / os.exit. The test files (fmttest, logtest, memiotest)
still carried the same @symbol("rt_syscall") syscall1ww / doexit
stub block with the (now stale) os↔io collision rationale. Same
mechanical drop as 12436dd: add use os;, route fail() through
os.exit, remove the stubs.

Also reword the stale workaround comment in lib/memio/memio.ww
covering rt_alloc/rt_free. The decls themselves stay until lib/os
exports alloc/free as a follow-up.

No combined.ww regen (these files aren't bootstrap-folded).
2026-05-16 00:03:19 +09:00
12436ddaca lib/fmt+lib/log: drop rt_syscall stubs; use os
After #9 (f1440bf) fn labels mangle by module, so lib/fmt and lib/log
can use os; without colliding with lib/io on the read/write/close
leaves at link.

Drop the @symbol("rt_syscall") rtsyscall3/rtsyscall1 + rawwrite/
rawexit wrappers in both files; route the 7 fmt + 3 log call sites
through os.write / os.exit. Trim the workaround-rationale comments.

Mechanical rename; underlying syscall numbers and args unchanged.
2026-05-15 23:53:02 +09:00
86de58bc6c lib+test: bufio rename bstream → stream
Validates the #15 same-leaf-name cross-module type fix (9d85aa4):
`bufio.stream` and `io.stream` now coexist on a `use bufio; use io;`
surface — bufiotest.ww references both in the same scope (e.g.
`let m: io.stream; let b: bufio.stream;`) and compiles clean.

Lifts the bufio-side workaround that bstream existed to dodge.
@test fns rename in lockstep (bstreamsmallwrite → streamsmallwrite,
etc.). Also tidies the stale "until #21 lands" parenthetical in
test/wcc/696_modtype_leaf_collision.c, since #21 is this commit.

make test: 54/54; bootstrap fixed-point 990–997 holds.
2026-05-15 14:16:53 +09:00
e7f173cde0 lib+test: add log over io.stream sink
Hare-shaped lib/log v1: logger vtable carrying one println slot,
stdlogger forwarding to a *io.stream, plus *logger globals (silent
/ default / global), setlogger, lprintln / println, lfatal / fatal.
Default sink is stderr through a private rt_syscall write callback;
graduates with #17 (cgen mod-mangle for fn labels), at which point
the rt_syscall stub disappears the same way fmt's will.

Module-scope struct/pointer-literal init isn't constexpr in cstage
emit_lets, so silent/default/global are wired lazily by ensureinit
on the first exported-fn entry (lib/temp rnginit pattern). Callers
that read the globals directly must call some lib/log fn first.

Skipped this round: printfln / lprintfln / fatalf / lfatalf and the
matching printfln vtable slot — they need a fmt {n}-placeholder
parser that isn't shipped yet. fatal / lfatal's exit(255) arm has
no test fixture (needs fork+wait for WEXITSTATUS); left as TODO.

971_log_run wraps the @test fixture under `ww run`, mirroring
970_fmt_run. make test: 54/54; bootstrap fixed-point (990-997)
holds.
2026-05-15 14:05:55 +09:00