lib: collapse the parallel vstream scaffold onto the single Hare io surface (#94 fold-eFinal)

The Option-C parallel _v vstream API was scaffolding to bring the io stack up alongside the old surface; carrying both permanently is a rule-9 divergence from ref/hare, which has exactly one io surface. Collapse onto that surface (stream = *vtable, ref/hare/io/stream.ha) and rename the _v symbols to their Hare names (io vstream->stream, fmt vfprint->fprint, bufio/memio/log surfaces, log.new). Deletes the 4 lib/*/vstream.ww scaffold files; regenerates w6c/wwdump combined.ww. cstage and wwstage stay byte-identical and combined_ww_fresh holds; all 220 tests pass.
This commit is contained in:
2026-05-30 03:24:23 +09:00
parent 80184a3acf
commit 7d39f6d623
31 changed files with 2371 additions and 4834 deletions

View File

@@ -44,11 +44,9 @@ fn streq(a: str, b: str) bool = {
// scenario must run before [[setloggerswap]].
@test fn defaultwiredtoglobal() void = {
let buf: [4]u8;
let mem: memio.state;
let s: io.stream;
memio.fixed(&mem, &s, buf[0:4]);
let sl: log.stdlogger;
log.new(&sl, &s); // triggers ensureinit
let mem: memio.stream = memio.fixed(buf[0:4]);
let s: io.stream = &mem.vt;
let sl: log.stdlogger = log.new(s); // triggers ensureinit
if (log.silent == nil) { fail(); };
if (log.default == nil) { fail(); };
@@ -60,12 +58,10 @@ fn streq(a: str, b: str) bool = {
@test fn lprintlnbasic() void = {
let buf: [32]u8;
let mem: memio.state;
let s: io.stream;
memio.fixed(&mem, &s, buf[0:32]);
let mem: memio.stream = memio.fixed(buf[0:32]);
let s: io.stream = &mem.vt;
let sl: log.stdlogger;
log.new(&sl, &s);
let sl: log.stdlogger = log.new(s);
log.lprintln(&sl.logger, "hello", 42i64);
@@ -76,12 +72,10 @@ fn streq(a: str, b: str) bool = {
@test fn lprintlnsingle() void = {
let buf: [16]u8;
let mem: memio.state;
let s: io.stream;
memio.fixed(&mem, &s, buf[0:16]);
let mem: memio.stream = memio.fixed(buf[0:16]);
let s: io.stream = &mem.vt;
let sl: log.stdlogger;
log.new(&sl, &s);
let sl: log.stdlogger = log.new(s);
log.lprintln(&sl.logger, "only");
@@ -92,12 +86,10 @@ fn streq(a: str, b: str) bool = {
@test fn lprintlnempty() void = {
let buf: [4]u8;
let mem: memio.state;
let s: io.stream;
memio.fixed(&mem, &s, buf[0:4]);
let mem: memio.stream = memio.fixed(buf[0:4]);
let s: io.stream = &mem.vt;
let sl: log.stdlogger;
log.new(&sl, &s);
let sl: log.stdlogger = log.new(s);
log.lprintln(&sl.logger);
@@ -114,12 +106,10 @@ fn streq(a: str, b: str) bool = {
// empty (silent has no path to it anyway).
@test fn silentwritesnothing() void = {
let buf: [16]u8;
let mem: memio.state;
let s: io.stream;
memio.fixed(&mem, &s, buf[0:16]);
let mem: memio.stream = memio.fixed(buf[0:16]);
let s: io.stream = &mem.vt;
let sl: log.stdlogger;
log.new(&sl, &s); // triggers log.ensureinit; populates log.silent
let sl: log.stdlogger = log.new(s); // triggers log.ensureinit; populates log.silent
if (log.silent == nil) { fail(); };
@@ -136,18 +126,14 @@ fn streq(a: str, b: str) bool = {
// the swap semantics.
@test fn setloggerswap() void = {
let buf1: [32]u8;
let mem1: memio.state;
let s1: io.stream;
memio.fixed(&mem1, &s1, buf1[0:32]);
let sl1: log.stdlogger;
log.new(&sl1, &s1);
let mem1: memio.stream = memio.fixed(buf1[0:32]);
let s1: io.stream = &mem1.vt;
let sl1: log.stdlogger = log.new(s1);
let buf2: [32]u8;
let mem2: memio.state;
let s2: io.stream;
memio.fixed(&mem2, &s2, buf2[0:32]);
let sl2: log.stdlogger;
log.new(&sl2, &s2);
let mem2: memio.stream = memio.fixed(buf2[0:32]);
let s2: io.stream = &mem2.vt;
let sl2: log.stdlogger = log.new(s2);
log.setlogger(&sl1.logger);
log.println("first");
@@ -171,12 +157,10 @@ fn streq(a: str, b: str) bool = {
@test fn lprintflnbasic() void = {
let buf: [32]u8;
let mem: memio.state;
let s: io.stream;
memio.fixed(&mem, &s, buf[0:32]);
let mem: memio.stream = memio.fixed(buf[0:32]);
let s: io.stream = &mem.vt;
let sl: log.stdlogger;
log.new(&sl, &s);
let sl: log.stdlogger = log.new(s);
log.lprintfln(&sl.logger, "x={} y={}", 42i64, "hi");
@@ -189,18 +173,14 @@ fn streq(a: str, b: str) bool = {
// install sl1 as global, printfln writes there; mem2 stays empty.
@test fn printflnglobal() void = {
let buf1: [32]u8;
let mem1: memio.state;
let s1: io.stream;
memio.fixed(&mem1, &s1, buf1[0:32]);
let sl1: log.stdlogger;
log.new(&sl1, &s1);
let mem1: memio.stream = memio.fixed(buf1[0:32]);
let s1: io.stream = &mem1.vt;
let sl1: log.stdlogger = log.new(s1);
let buf2: [32]u8;
let mem2: memio.state;
let s2: io.stream;
memio.fixed(&mem2, &s2, buf2[0:32]);
let sl2: log.stdlogger;
log.new(&sl2, &s2);
let mem2: memio.stream = memio.fixed(buf2[0:32]);
let s2: io.stream = &mem2.vt;
let sl2: log.stdlogger = log.new(s2);
log.setlogger(&sl1.logger);
log.printfln("v={}", 7i64);
@@ -215,12 +195,10 @@ fn streq(a: str, b: str) bool = {
// bare-args path.
@test fn silentignoresprintfln() void = {
let buf: [16]u8;
let mem: memio.state;
let s: io.stream;
memio.fixed(&mem, &s, buf[0:16]);
let mem: memio.stream = memio.fixed(buf[0:16]);
let s: io.stream = &mem.vt;
let sl: log.stdlogger;
log.new(&sl, &s); // triggers log.ensureinit; populates log.silent
let sl: log.stdlogger = log.new(s); // triggers log.ensureinit; populates log.silent
if (log.silent == nil) { fail(); };
@@ -236,12 +214,10 @@ fn streq(a: str, b: str) bool = {
// resolve correctly.
@test fn lprintflnindexed() void = {
let buf: [16]u8;
let mem: memio.state;
let s: io.stream;
memio.fixed(&mem, &s, buf[0:16]);
let mem: memio.stream = memio.fixed(buf[0:16]);
let s: io.stream = &mem.vt;
let sl: log.stdlogger;
log.new(&sl, &s);
let sl: log.stdlogger = log.new(s);
log.lprintfln(&sl.logger, "{1} {0}", "a", "b");
@@ -254,12 +230,10 @@ fn streq(a: str, b: str) bool = {
// intact (parser proper covered in fmttest).
@test fn lprintflnmods() void = {
let buf: [16]u8;
let mem: memio.state;
let s: io.stream;
memio.fixed(&mem, &s, buf[0:16]);
let mem: memio.stream = memio.fixed(buf[0:16]);
let s: io.stream = &mem.vt;
let sl: log.stdlogger;
log.new(&sl, &s);
let sl: log.stdlogger = log.new(s);
log.lprintfln(&sl.logger, "{:5}", 42i64);