selfhost/cmd/ww+w6l/main.ww: amalloc → alloc([], N)! (α-10)

Phase 0 #8 tenth α/γ-batch. 14 amalloc sites:
 - ww/main.ww: 11 (path bufs in importpathform/locatein/peekpackage/
   expanddir/arenadupcstr/builddirmodulepath/buildsearchpath + γ
   names/nlens in enumeratedir)
 - w6l/main.ww: 3 (resolvelib cstr+NUL paths)

α: *u8 → []u8 + .ptr at consumer; γ: **u8 / *u64 → []*u8 / []u64
with element-count alloc (was bytes/8).

Verified 132/132 + 995_self_rebuild byte-identity. ~27 amalloc
sites remain across 5 files; most blocked on #7 (astrndup),
#8 (β grow loops in w6a/parse, w6a/obj, w6l/dynout), #10 (cgoutarena).
This commit is contained in:
2026-05-21 04:36:20 +09:00
parent 6ff38f52bb
commit c91d684708
4 changed files with 70 additions and 70 deletions

View File

@@ -3203,30 +3203,30 @@ fn resolvelib(a: *arena, name: *u8, libdirs: **u8, nlibdirs: i32) *u8 = {
let _l1: u64 = buildpath(bufp.ptr, dir, name, ".so");
if (islinkable(bufp.ptr)) {
let pl: u64 = cstrlen(bufp.ptr);
let p: *u8 = amalloc(a, pl + 1u64): *u8;
let p: []u8 = alloc([], pl + 1u64)!;
let k: u64 = 0u64;
for (k <= pl) { p[k] = bufp[k]; k += 1u64; };
return p;
return p.ptr;
};
let v: u64 = 0u64;
for (v <= 8u64) {
let _l2: u64 = buildpathv(bufp.ptr, dir, name, v);
if (islinkable(bufp.ptr)) {
let pl2: u64 = cstrlen(bufp.ptr);
let p2: *u8 = amalloc(a, pl2 + 1u64): *u8;
let p2: []u8 = alloc([], pl2 + 1u64)!;
let k2: u64 = 0u64;
for (k2 <= pl2) { p2[k2] = bufp[k2]; k2 += 1u64; };
return p2;
return p2.ptr;
};
v += 1u64;
};
let _l3: u64 = buildpath(bufp.ptr, dir, name, ".a");
if (islinkable(bufp.ptr)) {
let pl3: u64 = cstrlen(bufp.ptr);
let p3: *u8 = amalloc(a, pl3 + 1u64): *u8;
let p3: []u8 = alloc([], pl3 + 1u64)!;
let k3: u64 = 0u64;
for (k3 <= pl3) { p3[k3] = bufp[k3]; k3 += 1u64; };
return p3;
return p3.ptr;
};
i += 1;
};

View File

@@ -139,30 +139,30 @@ fn resolvelib(a: *arena, name: *u8, libdirs: **u8, nlibdirs: i32) *u8 = {
let _l1: u64 = buildpath(bufp.ptr, dir, name, ".so");
if (islinkable(bufp.ptr)) {
let pl: u64 = cstrlen(bufp.ptr);
let p: *u8 = amalloc(a, pl + 1u64): *u8;
let p: []u8 = alloc([], pl + 1u64)!;
let k: u64 = 0u64;
for (k <= pl) { p[k] = bufp[k]; k += 1u64; };
return p;
return p.ptr;
};
let v: u64 = 0u64;
for (v <= 8u64) {
let _l2: u64 = buildpathv(bufp.ptr, dir, name, v);
if (islinkable(bufp.ptr)) {
let pl2: u64 = cstrlen(bufp.ptr);
let p2: *u8 = amalloc(a, pl2 + 1u64): *u8;
let p2: []u8 = alloc([], pl2 + 1u64)!;
let k2: u64 = 0u64;
for (k2 <= pl2) { p2[k2] = bufp[k2]; k2 += 1u64; };
return p2;
return p2.ptr;
};
v += 1u64;
};
let _l3: u64 = buildpath(bufp.ptr, dir, name, ".a");
if (islinkable(bufp.ptr)) {
let pl3: u64 = cstrlen(bufp.ptr);
let p3: *u8 = amalloc(a, pl3 + 1u64): *u8;
let p3: []u8 = alloc([], pl3 + 1u64)!;
let k3: u64 = 0u64;
for (k3 <= pl3) { p3[k3] = bufp[k3]; k3 += 1u64; };
return p3;
return p3.ptr;
};
i += 1;
};

View File

@@ -1098,7 +1098,7 @@ fn visitadd(c: *expctx, path: str) void = {
// (ref/hare/hare/module/srcs.ha:78 builds the same shape via
// path::push per ident part).
fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
let buf: *u8 = amalloc(a, namelen + 1u64): *u8;
let buf: []u8 = alloc([], namelen + 1u64)!;
let i: u64 = 0u64;
for (i < namelen) {
if (name[i] == 46u8) { buf[i] = 47u8; } // '.' -> '/'
@@ -1106,7 +1106,7 @@ fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
i += 1u64;
};
buf[namelen] = 0u8;
return buf;
return buf.ptr;
};
// Try <dir>/<path>/ as a directory, then <dir>/<path>.ww as a file.
@@ -1117,7 +1117,7 @@ fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
// `foo/foo.ha` fallback; a module IS the directory).
fn locatein(a: *arena, dir: *u8, dirlen: u64,
pathform: *u8, pflen: u64, isdir: *i32) *u8 = {
let buf: *u8 = amalloc(a, PATH_MAX): *u8;
let buf: []u8 = alloc([], PATH_MAX)!;
let off: u64 = 0u64;
let i: u64 = 0u64;
for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; };
@@ -1128,7 +1128,7 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
off += pflen;
buf[off] = 0u8;
let fi: os.filestat;
let r: (void | os.oserror) = os.stat(&fi, pathstr(buf));
let r: (void | os.oserror) = os.stat(&fi, pathstr(buf.ptr));
let isdirhit: bool = false;
match (r) {
case void => {
@@ -1139,10 +1139,10 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
};
if (isdirhit) {
*isdir = 1;
return buf;
return buf.ptr;
};
let buf2: *u8 = amalloc(a, PATH_MAX): *u8;
let buf2: []u8 = alloc([], PATH_MAX)!;
off = 0u64;
i = 0u64;
for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; };
@@ -1155,9 +1155,9 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
buf2[off] = 119u8; off += 1u64; // 'w'
buf2[off] = 119u8; off += 1u64; // 'w'
buf2[off] = 0u8;
if (os.access(pathstr(buf2), 0i32) == 0) {
if (os.access(pathstr(buf2.ptr), 0i32) == 0) {
*isdir = 0;
return buf2;
return buf2.ptr;
};
return nil;
};
@@ -1261,8 +1261,8 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
let fd: i32 = os.open(pathstr(dirpath), os.flag.RDONLY, 0i32);
if (fd < 0) { return nil: **u8, 0; };
let maxnames: i32 = 256;
let names: **u8 = amalloc(a, (maxnames: u64) * 8u64): **u8;
let nlens: *u64 = amalloc(a, (maxnames: u64) * 8u64): *u64;
let names: []*u8 = alloc([], maxnames: u64)!;
let nlens: []u64 = alloc([], maxnames: u64)!;
let n: i32 = 0;
let buf: []u8 = alloc([], 8192u64)!;
buf.len = 8192;
@@ -1278,11 +1278,11 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
let nl: u64 = cstrlen(nm);
if (dirfilekeep(nm, nl)) {
if (n < maxnames) {
let cp: *u8 = amalloc(a, nl + 1u64): *u8;
let cp: []u8 = alloc([], nl + 1u64)!;
let i: u64 = 0u64;
for (i < nl) { cp[i] = nm[i]; i += 1u64; };
cp[nl] = 0u8;
names[n] = cp;
names[n] = cp.ptr;
nlens[n] = nl;
n += 1;
};
@@ -1312,7 +1312,7 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
};
i += 1;
};
return names, n;
return names.ptr, n;
};
// ---- file slurp -------------------------------------------------------
@@ -1495,11 +1495,11 @@ fn peekpackage(a: *arena, pathcs: *u8) *u8 = {
};
let plen: u64 = t - start;
if (plen == 0u64) { return nil; };
let r: *u8 = amalloc(a, plen + 1u64): *u8;
let r: []u8 = alloc([], plen + 1u64)!;
let k: u64 = 0u64;
for (k < plen) { r[k] = buf[start + k]; k += 1u64; };
r[plen] = 0u8;
return r;
return r.ptr;
}; }; }; }; }; }; };
};
return nil;
@@ -1540,21 +1540,21 @@ fn expanddir(c: *expctx, dirpath: *u8) void = {
let i: i32 = 0;
for (i < n) {
let nlen: u64 = cstrlen(names[i]);
let fp: *u8 = amalloc(c.a, dlen + 1u64 + nlen + 1u64): *u8;
let fp: []u8 = alloc([], dlen + 1u64 + nlen + 1u64)!;
let k: u64 = 0u64;
for (k < dlen) { fp[k] = dirpath[k]; k += 1u64; };
fp[dlen] = 47u8; // '/'
k = 0u64;
for (k < nlen) { fp[dlen + 1u64 + k] = names[i][k]; k += 1u64; };
fp[dlen + 1u64 + nlen] = 0u8;
let pkg: *u8 = peekpackage(c.a, fp);
let pkg: *u8 = peekpackage(c.a, fp.ptr);
if (pkg != nil) {
if (dirpkg == nil) { dirpkg = pkg; }
else { if (!cstreq(dirpkg, pkg)) {
strictpkgmismatch(fp, pkg, dirpkg, dirpath);
strictpkgmismatch(fp.ptr, pkg, dirpkg, dirpath);
}; };
};
expand(c, fp);
expand(c, fp.ptr);
i += 1;
};
};
@@ -1847,18 +1847,18 @@ fn basenameoff(p: *u8, plen: u64) u64 = {
// arenadupcstr — copy `plen` bytes from `src` into a fresh NUL-sealed
// arena buffer.
fn arenadupcstr(a: *arena, src: *u8, plen: u64) *u8 = {
let buf: *u8 = amalloc(a, plen + 1u64): *u8;
let buf: []u8 = alloc([], plen + 1u64)!;
let i: u64 = 0u64;
for (i < plen) { buf[i] = src[i]; i += 1u64; };
buf[plen] = 0u8;
return buf;
return buf.ptr;
};
// builddirmodulepath — alloc <dir>/<base>.ww, NUL-terminated, in `a`.
fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
base: *u8, blen: u64) *u8 = {
let need: u64 = dlen + 1u64 + blen + 3u64 + 1u64;
let buf: *u8 = amalloc(a, need): *u8;
let buf: []u8 = alloc([], need)!;
let off: u64 = 0u64;
let i: u64 = 0u64;
for (i < dlen) { buf[off] = dir[i]; off += 1u64; i += 1u64; };
@@ -1869,26 +1869,26 @@ fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
buf[off] = 119u8; off += 1u64; // 'w'
buf[off] = 119u8; off += 1u64; // 'w'
buf[off] = 0u8;
return buf;
return buf.ptr;
};
// buildsearchpath — compose the colon-separated lookup path used by
// resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib
fn buildsearchpath(a: *arena, selfdir: *u8, incs: *u8) *u8 = {
let buf: *u8 = amalloc(a, PATH_MAX * 2u64): *u8;
let buf: []u8 = alloc([], PATH_MAX * 2u64)!;
let off: u64 = 0u64;
buf[off] = 46u8; off += 1u64; // '.'
if (incs != nil) {
if (incs[0u64] != 0u8) {
buf[off] = 58u8; off += 1u64; // ':'
off = cstrinto(buf, off, incs);
off = cstrinto(buf.ptr, off, incs);
};
};
buf[off] = 58u8; off += 1u64;
off = cstrinto(buf, off, selfdir);
off = strinto(buf, off, "/../../lib");
cstrseal(buf, off);
return buf;
off = cstrinto(buf.ptr, off, selfdir);
off = strinto(buf.ptr, off, "/../../lib");
cstrseal(buf.ptr, off);
return buf.ptr;
};
// resolvemodule — map a name like "foo", "lib/foo", "foo.ww", or

View File

@@ -236,7 +236,7 @@ fn visitadd(c: *expctx, path: str) void = {
// (ref/hare/hare/module/srcs.ha:78 builds the same shape via
// path::push per ident part).
fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
let buf: *u8 = amalloc(a, namelen + 1u64): *u8;
let buf: []u8 = alloc([], namelen + 1u64)!;
let i: u64 = 0u64;
for (i < namelen) {
if (name[i] == 46u8) { buf[i] = 47u8; } // '.' -> '/'
@@ -244,7 +244,7 @@ fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
i += 1u64;
};
buf[namelen] = 0u8;
return buf;
return buf.ptr;
};
// Try <dir>/<path>/ as a directory, then <dir>/<path>.ww as a file.
@@ -255,7 +255,7 @@ fn importpathform(a: *arena, name: *u8, namelen: u64) *u8 = {
// `foo/foo.ha` fallback; a module IS the directory).
fn locatein(a: *arena, dir: *u8, dirlen: u64,
pathform: *u8, pflen: u64, isdir: *i32) *u8 = {
let buf: *u8 = amalloc(a, PATH_MAX): *u8;
let buf: []u8 = alloc([], PATH_MAX)!;
let off: u64 = 0u64;
let i: u64 = 0u64;
for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; };
@@ -266,7 +266,7 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
off += pflen;
buf[off] = 0u8;
let fi: os.filestat;
let r: (void | os.oserror) = os.stat(&fi, pathstr(buf));
let r: (void | os.oserror) = os.stat(&fi, pathstr(buf.ptr));
let isdirhit: bool = false;
match (r) {
case void => {
@@ -277,10 +277,10 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
};
if (isdirhit) {
*isdir = 1;
return buf;
return buf.ptr;
};
let buf2: *u8 = amalloc(a, PATH_MAX): *u8;
let buf2: []u8 = alloc([], PATH_MAX)!;
off = 0u64;
i = 0u64;
for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; };
@@ -293,9 +293,9 @@ fn locatein(a: *arena, dir: *u8, dirlen: u64,
buf2[off] = 119u8; off += 1u64; // 'w'
buf2[off] = 119u8; off += 1u64; // 'w'
buf2[off] = 0u8;
if (os.access(pathstr(buf2), 0i32) == 0) {
if (os.access(pathstr(buf2.ptr), 0i32) == 0) {
*isdir = 0;
return buf2;
return buf2.ptr;
};
return nil;
};
@@ -399,8 +399,8 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
let fd: i32 = os.open(pathstr(dirpath), os.flag.RDONLY, 0i32);
if (fd < 0) { return nil: **u8, 0; };
let maxnames: i32 = 256;
let names: **u8 = amalloc(a, (maxnames: u64) * 8u64): **u8;
let nlens: *u64 = amalloc(a, (maxnames: u64) * 8u64): *u64;
let names: []*u8 = alloc([], maxnames: u64)!;
let nlens: []u64 = alloc([], maxnames: u64)!;
let n: i32 = 0;
let buf: []u8 = alloc([], 8192u64)!;
buf.len = 8192;
@@ -416,11 +416,11 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
let nl: u64 = cstrlen(nm);
if (dirfilekeep(nm, nl)) {
if (n < maxnames) {
let cp: *u8 = amalloc(a, nl + 1u64): *u8;
let cp: []u8 = alloc([], nl + 1u64)!;
let i: u64 = 0u64;
for (i < nl) { cp[i] = nm[i]; i += 1u64; };
cp[nl] = 0u8;
names[n] = cp;
names[n] = cp.ptr;
nlens[n] = nl;
n += 1;
};
@@ -450,7 +450,7 @@ fn enumeratedir(a: *arena, dirpath: *u8) (**u8, i32) = {
};
i += 1;
};
return names, n;
return names.ptr, n;
};
// ---- file slurp -------------------------------------------------------
@@ -633,11 +633,11 @@ fn peekpackage(a: *arena, pathcs: *u8) *u8 = {
};
let plen: u64 = t - start;
if (plen == 0u64) { return nil; };
let r: *u8 = amalloc(a, plen + 1u64): *u8;
let r: []u8 = alloc([], plen + 1u64)!;
let k: u64 = 0u64;
for (k < plen) { r[k] = buf[start + k]; k += 1u64; };
r[plen] = 0u8;
return r;
return r.ptr;
}; }; }; }; }; }; };
};
return nil;
@@ -678,21 +678,21 @@ fn expanddir(c: *expctx, dirpath: *u8) void = {
let i: i32 = 0;
for (i < n) {
let nlen: u64 = cstrlen(names[i]);
let fp: *u8 = amalloc(c.a, dlen + 1u64 + nlen + 1u64): *u8;
let fp: []u8 = alloc([], dlen + 1u64 + nlen + 1u64)!;
let k: u64 = 0u64;
for (k < dlen) { fp[k] = dirpath[k]; k += 1u64; };
fp[dlen] = 47u8; // '/'
k = 0u64;
for (k < nlen) { fp[dlen + 1u64 + k] = names[i][k]; k += 1u64; };
fp[dlen + 1u64 + nlen] = 0u8;
let pkg: *u8 = peekpackage(c.a, fp);
let pkg: *u8 = peekpackage(c.a, fp.ptr);
if (pkg != nil) {
if (dirpkg == nil) { dirpkg = pkg; }
else { if (!cstreq(dirpkg, pkg)) {
strictpkgmismatch(fp, pkg, dirpkg, dirpath);
strictpkgmismatch(fp.ptr, pkg, dirpkg, dirpath);
}; };
};
expand(c, fp);
expand(c, fp.ptr);
i += 1;
};
};
@@ -985,18 +985,18 @@ fn basenameoff(p: *u8, plen: u64) u64 = {
// arenadupcstr — copy `plen` bytes from `src` into a fresh NUL-sealed
// arena buffer.
fn arenadupcstr(a: *arena, src: *u8, plen: u64) *u8 = {
let buf: *u8 = amalloc(a, plen + 1u64): *u8;
let buf: []u8 = alloc([], plen + 1u64)!;
let i: u64 = 0u64;
for (i < plen) { buf[i] = src[i]; i += 1u64; };
buf[plen] = 0u8;
return buf;
return buf.ptr;
};
// builddirmodulepath — alloc <dir>/<base>.ww, NUL-terminated, in `a`.
fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
base: *u8, blen: u64) *u8 = {
let need: u64 = dlen + 1u64 + blen + 3u64 + 1u64;
let buf: *u8 = amalloc(a, need): *u8;
let buf: []u8 = alloc([], need)!;
let off: u64 = 0u64;
let i: u64 = 0u64;
for (i < dlen) { buf[off] = dir[i]; off += 1u64; i += 1u64; };
@@ -1007,26 +1007,26 @@ fn builddirmodulepath(a: *arena, dir: *u8, dlen: u64,
buf[off] = 119u8; off += 1u64; // 'w'
buf[off] = 119u8; off += 1u64; // 'w'
buf[off] = 0u8;
return buf;
return buf.ptr;
};
// buildsearchpath — compose the colon-separated lookup path used by
// resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib
fn buildsearchpath(a: *arena, selfdir: *u8, incs: *u8) *u8 = {
let buf: *u8 = amalloc(a, PATH_MAX * 2u64): *u8;
let buf: []u8 = alloc([], PATH_MAX * 2u64)!;
let off: u64 = 0u64;
buf[off] = 46u8; off += 1u64; // '.'
if (incs != nil) {
if (incs[0u64] != 0u8) {
buf[off] = 58u8; off += 1u64; // ':'
off = cstrinto(buf, off, incs);
off = cstrinto(buf.ptr, off, incs);
};
};
buf[off] = 58u8; off += 1u64;
off = cstrinto(buf, off, selfdir);
off = strinto(buf, off, "/../../lib");
cstrseal(buf, off);
return buf;
off = cstrinto(buf.ptr, off, selfdir);
off = strinto(buf.ptr, off, "/../../lib");
cstrseal(buf.ptr, off);
return buf.ptr;
};
// resolvemodule — map a name like "foo", "lib/foo", "foo.ww", or