From d9f097250b4aaf6c821fc001cb30aa9ed8593f93 Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Thu, 21 May 2026 09:14:39 +0900 Subject: [PATCH] =?UTF-8?q?lib/ww/lex=20+=20w6a/parse:=20amalloc=20=CE=B2?= =?UTF-8?q?=20grow=20=E2=86=92=20alloc([],=20n)!=20(=CE=B2-1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 0 first β-batch. 4 amalloc sites across 2 β grow loops: - lib/ww/lex/lex.ww:570,592 lexstr string-literal escape buf - selfhost/cmd/w6a/parse.ww:513,548 DATA "..." escape-payload buf Both follow the established α-per-alloc shape with loop logic left manual: `*u8 = amalloc(_, cap): *u8` → `[]u8 = alloc([], cap)!`, inner copy `nb[i] = old[i]` unchanged (slice indexing emits identical asm to *u8 indexing — no .len bounds compare), `.ptr` extracted at the *u8 consumer (s.ptr, pr.bytes). Bear-trap N/A — byte count tracked in locals (nb, blen), slice .len = 0 never read. Verified 132/132 + 995_self_rebuild byte-identity. --- lib/ww/lex/lex.ww | 6 +++--- selfhost/cmd/w6a/main.combined.ww | 6 +++--- selfhost/cmd/w6a/parse.ww | 6 +++--- selfhost/cmd/w6c/main.combined.ww | 6 +++--- selfhost/cmd/wwdump/main.combined.ww | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/ww/lex/lex.ww b/lib/ww/lex/lex.ww index 04bce907..04e164a5 100644 --- a/lib/ww/lex/lex.ww +++ b/lib/ww/lex/lex.ww @@ -567,7 +567,7 @@ fn lexident(l: *lex, start: *pos, out: *tok) void = { fn lexstr(l: *lex, start: *pos, out: *tok) void = { let cap: u64 = 32u64; let nb: u64 = 0u64; - let buf: *u8 = amalloc(l.a, cap): *u8; + let buf: []u8 = alloc([], cap)!; for (true) { let c: i32 = lpeek(l, 0u64); if (c < 0) { @@ -589,7 +589,7 @@ fn lexstr(l: *lex, start: *pos, out: *tok) void = { }; if (nb + 1u64 >= cap) { let ncap: u64 = cap * 2u64; - let nb2: *u8 = amalloc(l.a, ncap): *u8; + let nb2: []u8 = alloc([], ncap)!; let i: u64 = 0u64; for (i < nb) { let ix: i32 = i: i32; @@ -608,7 +608,7 @@ fn lexstr(l: *lex, start: *pos, out: *tok) void = { out.line = start.line; out.col = start.col; let s: str; - s.ptr = buf; + s.ptr = buf.ptr; s.len = nb: i32; out.text = s; }; diff --git a/selfhost/cmd/w6a/main.combined.ww b/selfhost/cmd/w6a/main.combined.ww index ffd0444b..1fc9a699 100644 --- a/selfhost/cmd/w6a/main.combined.ww +++ b/selfhost/cmd/w6a/main.combined.ww @@ -1662,7 +1662,7 @@ export fn parse(a: *asm_) i32 = { // Parse escape sequence into a fresh growable buffer. let cap: u64 = 32u64; let blen: u64 = 0u64; - let dbuf: *u8 = amalloc(a.a, cap): *u8; + let dbuf: []u8 = alloc([], cap)!; for (p2 < n) { if (line[p2] == 34u8) { p2 = p2; p2 += 0u64; p2 = n + 1u64; } else { @@ -1697,7 +1697,7 @@ export fn parse(a: *asm_) i32 = { }; if (blen + 1u64 > cap) { let ncap: u64 = cap * 2u64; - let nb: *u8 = amalloc(a.a, ncap): *u8; + let nb: []u8 = alloc([], ncap)!; let bi: u64 = 0u64; for (bi < blen) { nb[bi] = dbuf[bi]; bi += 1u64; }; dbuf = nb; @@ -1707,7 +1707,7 @@ export fn parse(a: *asm_) i32 = { blen += 1u64; }; }; - pr.bytes = dbuf; + pr.bytes = dbuf.ptr; pr.nbytes = blen; a.line += 1; continue; }; diff --git a/selfhost/cmd/w6a/parse.ww b/selfhost/cmd/w6a/parse.ww index af17671b..1c5915cb 100644 --- a/selfhost/cmd/w6a/parse.ww +++ b/selfhost/cmd/w6a/parse.ww @@ -510,7 +510,7 @@ export fn parse(a: *asm_) i32 = { // Parse escape sequence into a fresh growable buffer. let cap: u64 = 32u64; let blen: u64 = 0u64; - let dbuf: *u8 = amalloc(a.a, cap): *u8; + let dbuf: []u8 = alloc([], cap)!; for (p2 < n) { if (line[p2] == 34u8) { p2 = p2; p2 += 0u64; p2 = n + 1u64; } else { @@ -545,7 +545,7 @@ export fn parse(a: *asm_) i32 = { }; if (blen + 1u64 > cap) { let ncap: u64 = cap * 2u64; - let nb: *u8 = amalloc(a.a, ncap): *u8; + let nb: []u8 = alloc([], ncap)!; let bi: u64 = 0u64; for (bi < blen) { nb[bi] = dbuf[bi]; bi += 1u64; }; dbuf = nb; @@ -555,7 +555,7 @@ export fn parse(a: *asm_) i32 = { blen += 1u64; }; }; - pr.bytes = dbuf; + pr.bytes = dbuf.ptr; pr.nbytes = blen; a.line += 1; continue; }; diff --git a/selfhost/cmd/w6c/main.combined.ww b/selfhost/cmd/w6c/main.combined.ww index 4b91a9fe..2ff6b5c7 100644 --- a/selfhost/cmd/w6c/main.combined.ww +++ b/selfhost/cmd/w6c/main.combined.ww @@ -4279,7 +4279,7 @@ fn lexident(l: *lex, start: *pos, out: *tok) void = { fn lexstr(l: *lex, start: *pos, out: *tok) void = { let cap: u64 = 32u64; let nb: u64 = 0u64; - let buf: *u8 = amalloc(l.a, cap): *u8; + let buf: []u8 = alloc([], cap)!; for (true) { let c: i32 = lpeek(l, 0u64); if (c < 0) { @@ -4301,7 +4301,7 @@ fn lexstr(l: *lex, start: *pos, out: *tok) void = { }; if (nb + 1u64 >= cap) { let ncap: u64 = cap * 2u64; - let nb2: *u8 = amalloc(l.a, ncap): *u8; + let nb2: []u8 = alloc([], ncap)!; let i: u64 = 0u64; for (i < nb) { let ix: i32 = i: i32; @@ -4320,7 +4320,7 @@ fn lexstr(l: *lex, start: *pos, out: *tok) void = { out.line = start.line; out.col = start.col; let s: str; - s.ptr = buf; + s.ptr = buf.ptr; s.len = nb: i32; out.text = s; }; diff --git a/selfhost/cmd/wwdump/main.combined.ww b/selfhost/cmd/wwdump/main.combined.ww index b2d76e67..ace9d173 100644 --- a/selfhost/cmd/wwdump/main.combined.ww +++ b/selfhost/cmd/wwdump/main.combined.ww @@ -4279,7 +4279,7 @@ fn lexident(l: *lex, start: *pos, out: *tok) void = { fn lexstr(l: *lex, start: *pos, out: *tok) void = { let cap: u64 = 32u64; let nb: u64 = 0u64; - let buf: *u8 = amalloc(l.a, cap): *u8; + let buf: []u8 = alloc([], cap)!; for (true) { let c: i32 = lpeek(l, 0u64); if (c < 0) { @@ -4301,7 +4301,7 @@ fn lexstr(l: *lex, start: *pos, out: *tok) void = { }; if (nb + 1u64 >= cap) { let ncap: u64 = cap * 2u64; - let nb2: *u8 = amalloc(l.a, ncap): *u8; + let nb2: []u8 = alloc([], ncap)!; let i: u64 = 0u64; for (i < nb) { let ix: i32 = i: i32; @@ -4320,7 +4320,7 @@ fn lexstr(l: *lex, start: *pos, out: *tok) void = { out.line = start.line; out.col = start.col; let s: str; - s.ptr = buf; + s.ptr = buf.ptr; s.len = nb: i32; out.text = s; };