cmd/ww: drop duplicate PATH_MAX def; use os.PATH_MAX

main.ww was declaring `def PATH_MAX: u64 = 4096u64;` alongside the
imported os module's `export def PATH_MAX: i32 = 4096;` (lib/os/os.ww:91).
The duplicate triggered the cstage mod_map last-write-wins attribution
bug (#127): cstage emitted `main.PATH_MAX` for os's DATA entry too,
producing two 4096-byte slots and a wrong-module symbol. Both stages
shipped working binaries because LOADs all routed to main.PATH_MAX(SB),
but the divergence was real.

Removing the duplicate closes the only known #127 consumer per rule-7;
the defensive cstage cgen fix stays filed (task #11) until a new
duplicate-def collision surfaces. PATH_MAX use-sites in main.ww cast
`os.PATH_MAX: u64` at point-of-use for alloc/arithmetic, and use the
bare i32 form directly for slice .len assigns (which expect i32).

No cgen surface touched; byte-id-neutral on the 990-997 gates.
This commit is contained in:
2026-05-27 01:15:28 +09:00
parent 07e57ff9a6
commit 90d31c5b41
2 changed files with 86 additions and 84 deletions

View File

@@ -2724,8 +2724,9 @@ import rt;
import strings; import strings;
// All path/string scratch buffers go on the runtime page allocator. // All path/string scratch buffers go on the runtime page allocator.
// One page is plenty for any path we build. // One page is plenty for any path we build. PATH_MAX lives in lib/os
def PATH_MAX: u64 = 4096u64; // (os.PATH_MAX: i32 = 4096) — the duplicate u64 def was dropped to close
// the cgen #127 mod-mangle attribution bug consumer per rule-7.
def CMD_MAX: u64 = 8192u64; def CMD_MAX: u64 = 8192u64;
// ---- C-string helpers -------------------------------------------------- // ---- C-string helpers --------------------------------------------------
@@ -2845,8 +2846,8 @@ fn selfdirinto(dst: *u8, dstsz: u64, argv0: *u8) void = {
// Build "$dir/$name" (NUL-terminated) into a fresh page-sized buffer. // Build "$dir/$name" (NUL-terminated) into a fresh page-sized buffer.
fn joinpath(dir: *u8, name: *u8) *u8 = { fn joinpath(dir: *u8, name: *u8) *u8 = {
let buf: []u8 = alloc([], PATH_MAX)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64))!;
buf.len = PATH_MAX: i32; buf.len = os.PATH_MAX;
let off: u64 = cstrinto(buf.ptr, 0u64, dir); let off: u64 = cstrinto(buf.ptr, 0u64, dir);
off = byteinto(buf.ptr, off, 47u8); off = byteinto(buf.ptr, off, 47u8);
off = cstrinto(buf.ptr, off, name); off = cstrinto(buf.ptr, off, name);
@@ -2856,8 +2857,8 @@ fn joinpath(dir: *u8, name: *u8) *u8 = {
// Same, but the second component is a ww `str` literal. // Same, but the second component is a ww `str` literal.
fn joinpathlit(dir: *u8, name: str) *u8 = { fn joinpathlit(dir: *u8, name: str) *u8 = {
let buf: []u8 = alloc([], PATH_MAX)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64))!;
buf.len = PATH_MAX: i32; buf.len = os.PATH_MAX;
let off: u64 = cstrinto(buf.ptr, 0u64, dir); let off: u64 = cstrinto(buf.ptr, 0u64, dir);
off = byteinto(buf.ptr, off, 47u8); off = byteinto(buf.ptr, off, 47u8);
off = strinto(buf.ptr, off, name); off = strinto(buf.ptr, off, name);
@@ -2960,7 +2961,7 @@ fn importpathform(name: *u8, namelen: u64) *u8 = {
// `foo/foo.ha` fallback; a module IS the directory). // `foo/foo.ha` fallback; a module IS the directory).
fn locatein(dir: *u8, dirlen: u64, fn locatein(dir: *u8, dirlen: u64,
pathform: *u8, pflen: u64, isdir: *i32) *u8 = { pathform: *u8, pflen: u64, isdir: *i32) *u8 = {
let buf: []u8 = alloc([], PATH_MAX)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64))!;
let off: u64 = 0u64; let off: u64 = 0u64;
let i: u64 = 0u64; let i: u64 = 0u64;
for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; }; for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; };
@@ -2985,7 +2986,7 @@ fn locatein(dir: *u8, dirlen: u64,
return buf.ptr; return buf.ptr;
}; };
let buf2: []u8 = alloc([], PATH_MAX)!; let buf2: []u8 = alloc([], (os.PATH_MAX: u64))!;
off = 0u64; off = 0u64;
i = 0u64; i = 0u64;
for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; }; for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; };
@@ -3430,8 +3431,8 @@ fn makestem(stem: *u8, src: *u8) void = {
// Append a literal suffix to `stem` (which already lives in a buffer). // Append a literal suffix to `stem` (which already lives in a buffer).
fn appendlit(stem: *u8, suffix: str) *u8 = { fn appendlit(stem: *u8, suffix: str) *u8 = {
let buf: []u8 = alloc([], PATH_MAX)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64))!;
buf.len = PATH_MAX: i32; buf.len = os.PATH_MAX;
let off: u64 = cstrinto(buf.ptr, 0u64, stem); let off: u64 = cstrinto(buf.ptr, 0u64, stem);
off = strinto(buf.ptr, off, suffix); off = strinto(buf.ptr, off, suffix);
cstrseal(buf.ptr, off); cstrseal(buf.ptr, off);
@@ -3467,8 +3468,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
let l6: *u8 = joinpathlit(selfdir, "w6l_ww"); let l6: *u8 = joinpathlit(selfdir, "w6l_ww");
// Default lib search path: <selfdir>/../../lib // Default lib search path: <selfdir>/../../lib
let dotdotlib: []u8 = alloc([], PATH_MAX)!; let dotdotlib: []u8 = alloc([], (os.PATH_MAX: u64))!;
dotdotlib.len = PATH_MAX: i32; dotdotlib.len = os.PATH_MAX;
{ {
let off: u64 = cstrinto(dotdotlib.ptr, 0u64, selfdir); let off: u64 = cstrinto(dotdotlib.ptr, 0u64, selfdir);
off = strinto(dotdotlib.ptr, off, "/../../lib"); off = strinto(dotdotlib.ptr, off, "/../../lib");
@@ -3481,8 +3482,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
// convention assumes you're running from the module dir; our // convention assumes you're running from the module dir; our
// wrappers don't cd, so dirname(src) stands in as the closest // wrappers don't cd, so dirname(src) stands in as the closest
// analog. Source-dir wins ties over the system path (cc -I.). // analog. Source-dir wins ties over the system path (cc -I.).
let srcd: []u8 = alloc([], PATH_MAX)!; let srcd: []u8 = alloc([], (os.PATH_MAX: u64))!;
srcd.len = PATH_MAX: i32; srcd.len = os.PATH_MAX;
if (entryisdir != 0) { if (entryisdir != 0) {
let slen: u64 = cstrlen(src); let slen: u64 = cstrlen(src);
let k: u64 = 0u64; let k: u64 = 0u64;
@@ -3516,8 +3517,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
}; };
// Compose searchpath: srcd + ':' + incs + ':' + dotdotlib. // Compose searchpath: srcd + ':' + incs + ':' + dotdotlib.
let searchpath: []u8 = alloc([], PATH_MAX * 3u64)!; let searchpath: []u8 = alloc([], (os.PATH_MAX: u64) * 3u64)!;
searchpath.len = (PATH_MAX * 3u64): i32; searchpath.len = ((os.PATH_MAX: u64) * 3u64): i32;
{ {
let off: u64 = cstrinto(searchpath.ptr, 0u64, srcd.ptr); let off: u64 = cstrinto(searchpath.ptr, 0u64, srcd.ptr);
off = byteinto(searchpath.ptr, off, 58u8); // ':' off = byteinto(searchpath.ptr, off, 58u8); // ':'
@@ -3531,8 +3532,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
// Stem for .s/.o/.combined.ww side files. Dir entry: <dir>/<base>; // Stem for .s/.o/.combined.ww side files. Dir entry: <dir>/<base>;
// file entry: src stripped of .ww. // file entry: src stripped of .ww.
let stem: []u8 = alloc([], PATH_MAX)!; let stem: []u8 = alloc([], (os.PATH_MAX: u64))!;
stem.len = PATH_MAX: i32; stem.len = os.PATH_MAX;
if (entryisdir != 0) { if (entryisdir != 0) {
let dlen: u64 = cstrlen(srcd.ptr); let dlen: u64 = cstrlen(srcd.ptr);
let bo: u64 = basenameoff(srcd.ptr, dlen); let bo: u64 = basenameoff(srcd.ptr, dlen);
@@ -3549,8 +3550,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
let combined: *u8 = appendlit(stem.ptr, ".combined.ww"); let combined: *u8 = appendlit(stem.ptr, ".combined.ww");
// libwwrt.a path: <selfdir>/../lib/libwwrt.a // libwwrt.a path: <selfdir>/../lib/libwwrt.a
let libwwrt: []u8 = alloc([], PATH_MAX)!; let libwwrt: []u8 = alloc([], (os.PATH_MAX: u64))!;
libwwrt.len = PATH_MAX: i32; libwwrt.len = os.PATH_MAX;
{ {
let off: u64 = cstrinto(libwwrt.ptr, 0u64, selfdir); let off: u64 = cstrinto(libwwrt.ptr, 0u64, selfdir);
off = strinto(libwwrt.ptr, off, "/../lib/libwwrt.a"); off = strinto(libwwrt.ptr, off, "/../lib/libwwrt.a");
@@ -3701,7 +3702,7 @@ fn arenadupcstr(src: *u8, plen: u64) *u8 = {
// buildsearchpath — compose the colon-separated lookup path used by // buildsearchpath — compose the colon-separated lookup path used by
// resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib // resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib
fn buildsearchpath(selfdir: *u8, incs: *u8) *u8 = { fn buildsearchpath(selfdir: *u8, incs: *u8) *u8 = {
let buf: []u8 = alloc([], PATH_MAX * 2u64)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64) * 2u64)!;
let off: u64 = 0u64; let off: u64 = 0u64;
buf[off] = 46u8; off += 1u64; // '.' buf[off] = 46u8; off += 1u64; // '.'
if (incs != nil) { if (incs != nil) {
@@ -3776,8 +3777,8 @@ fn defaultoutpath(src: *u8) *u8 = {
if (src[i] == 47u8) { start = i + 1u64; }; // '/' if (src[i] == 47u8) { start = i + 1u64; }; // '/'
i += 1u64; i += 1u64;
}; };
let out: []u8 = alloc([], PATH_MAX)!; let out: []u8 = alloc([], (os.PATH_MAX: u64))!;
out.len = PATH_MAX: i32; out.len = os.PATH_MAX;
let off: u64 = 0u64; let off: u64 = 0u64;
let j: u64 = start; let j: u64 = start;
for (j < n) { for (j < n) {
@@ -3801,8 +3802,8 @@ fn defaultoutpath(src: *u8) *u8 = {
fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = { fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
let src: *u8 = nil; let src: *u8 = nil;
let incs: []u8 = alloc([], PATH_MAX * 2u64)!; let incs: []u8 = alloc([], (os.PATH_MAX: u64) * 2u64)!;
incs.len = (PATH_MAX * 2u64): i32; incs.len = ((os.PATH_MAX: u64) * 2u64): i32;
let incoff: u64 = 0u64; let incoff: u64 = 0u64;
cstrseal(incs.ptr, 0u64); cstrseal(incs.ptr, 0u64);
@@ -3901,8 +3902,8 @@ fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
rlen -= 1u64; rlen -= 1u64;
}; };
let bo: u64 = basenameoff(resolved, rlen); let bo: u64 = basenameoff(resolved, rlen);
let outbuf: []u8 = alloc([], PATH_MAX)!; let outbuf: []u8 = alloc([], (os.PATH_MAX: u64))!;
outbuf.len = PATH_MAX: i32; outbuf.len = os.PATH_MAX;
out = outbuf.ptr; out = outbuf.ptr;
let i: u64 = bo; let i: u64 = bo;
let off: u64 = 0u64; let off: u64 = 0u64;
@@ -3952,8 +3953,8 @@ fn makeruntmp(buf: *u8) void = {
fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = { fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
let src: *u8 = nil; let src: *u8 = nil;
let passstart: i32 = -1; // first argv idx to pass through to program let passstart: i32 = -1; // first argv idx to pass through to program
let incs: []u8 = alloc([], PATH_MAX * 2u64)!; let incs: []u8 = alloc([], (os.PATH_MAX: u64) * 2u64)!;
incs.len = (PATH_MAX * 2u64): i32; incs.len = ((os.PATH_MAX: u64) * 2u64): i32;
let incoff: u64 = 0u64; let incoff: u64 = 0u64;
cstrseal(incs.ptr, 0u64); cstrseal(incs.ptr, 0u64);
@@ -4052,8 +4053,8 @@ fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
return 1; return 1;
}; };
let tmp: []u8 = alloc([], PATH_MAX)!; let tmp: []u8 = alloc([], (os.PATH_MAX: u64))!;
tmp.len = PATH_MAX: i32; tmp.len = os.PATH_MAX;
makeruntmp(tmp.ptr); makeruntmp(tmp.ptr);
let lf: lflags; let lf: lflags;
lf.libdirs = libdirs.ptr; lf.libdirs = libdirs.ptr;
@@ -4091,8 +4092,8 @@ fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
// report ok/FAIL per file, return 0 iff all pass. // report ok/FAIL per file, return 0 iff all pass.
fn runsingletest(selfdir: *u8, src: *u8) i32 = { fn runsingletest(selfdir: *u8, src: *u8) i32 = {
let tmp: []u8 = alloc([], PATH_MAX)!; let tmp: []u8 = alloc([], (os.PATH_MAX: u64))!;
tmp.len = PATH_MAX: i32; tmp.len = os.PATH_MAX;
makeruntmp(tmp.ptr); makeruntmp(tmp.ptr);
if (buildone(selfdir, src, 0, tmp.ptr, "\0".ptr, nil) != 0) { if (buildone(selfdir, src, 0, tmp.ptr, "\0".ptr, nil) != 0) {
os.remove(pathstr(tmp.ptr)); os.remove(pathstr(tmp.ptr));
@@ -4133,8 +4134,8 @@ fn rundirtests(selfdir: *u8, dir: *u8) i32 = {
if (cstrendswithlit(name, "_test.ww")) { if (cstrendswithlit(name, "_test.ww")) {
let nlen: u64 = cstrlen(name); let nlen: u64 = cstrlen(name);
// path = <dir>/<name> // path = <dir>/<name>
let path: []u8 = alloc([], PATH_MAX)!; let path: []u8 = alloc([], (os.PATH_MAX: u64))!;
path.len = PATH_MAX: i32; path.len = os.PATH_MAX;
let poff: u64 = cstrinto(path.ptr, 0u64, dir); let poff: u64 = cstrinto(path.ptr, 0u64, dir);
path[poff] = 47u8; poff += 1u64; path[poff] = 47u8; poff += 1u64;
let i: u64 = 0u64; let i: u64 = 0u64;
@@ -4142,12 +4143,12 @@ fn rundirtests(selfdir: *u8, dir: *u8) i32 = {
poff += nlen; poff += nlen;
cstrseal(path.ptr, poff); cstrseal(path.ptr, poff);
// incs = <dir> so test files can `use ` siblings // incs = <dir> so test files can `use ` siblings
let tincs: []u8 = alloc([], PATH_MAX)!; let tincs: []u8 = alloc([], (os.PATH_MAX: u64))!;
tincs.len = PATH_MAX: i32; tincs.len = os.PATH_MAX;
let ic: u64 = cstrinto(tincs.ptr, 0u64, dir); let ic: u64 = cstrinto(tincs.ptr, 0u64, dir);
cstrseal(tincs.ptr, ic); cstrseal(tincs.ptr, ic);
let tmp: []u8 = alloc([], PATH_MAX)!; let tmp: []u8 = alloc([], (os.PATH_MAX: u64))!;
tmp.len = PATH_MAX: i32; tmp.len = os.PATH_MAX;
makeruntmp(tmp.ptr); makeruntmp(tmp.ptr);
let bres: i32 = buildone(selfdir, path.ptr, 0, tmp.ptr, tincs.ptr, nil); let bres: i32 = buildone(selfdir, path.ptr, 0, tmp.ptr, tincs.ptr, nil);
if (bres != 0) { if (bres != 0) {
@@ -4213,9 +4214,9 @@ export fn main(argc: i32, argv: **u8) i32 = {
}; };
// selfdir = dirname(argv[0]) // selfdir = dirname(argv[0])
let selfdir: []u8 = alloc([], PATH_MAX)!; let selfdir: []u8 = alloc([], (os.PATH_MAX: u64))!;
selfdir.len = PATH_MAX: i32; selfdir.len = os.PATH_MAX;
selfdirinto(selfdir.ptr, PATH_MAX, argv[0]); selfdirinto(selfdir.ptr, (os.PATH_MAX: u64), argv[0]);
if (argc < 2) { if (argc < 2) {
writeusage(2); writeusage(2);

View File

@@ -18,8 +18,9 @@ import rt;
import strings; import strings;
// All path/string scratch buffers go on the runtime page allocator. // All path/string scratch buffers go on the runtime page allocator.
// One page is plenty for any path we build. // One page is plenty for any path we build. PATH_MAX lives in lib/os
def PATH_MAX: u64 = 4096u64; // (os.PATH_MAX: i32 = 4096) — the duplicate u64 def was dropped to close
// the cgen #127 mod-mangle attribution bug consumer per rule-7.
def CMD_MAX: u64 = 8192u64; def CMD_MAX: u64 = 8192u64;
// ---- C-string helpers -------------------------------------------------- // ---- C-string helpers --------------------------------------------------
@@ -139,8 +140,8 @@ fn selfdirinto(dst: *u8, dstsz: u64, argv0: *u8) void = {
// Build "$dir/$name" (NUL-terminated) into a fresh page-sized buffer. // Build "$dir/$name" (NUL-terminated) into a fresh page-sized buffer.
fn joinpath(dir: *u8, name: *u8) *u8 = { fn joinpath(dir: *u8, name: *u8) *u8 = {
let buf: []u8 = alloc([], PATH_MAX)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64))!;
buf.len = PATH_MAX: i32; buf.len = os.PATH_MAX;
let off: u64 = cstrinto(buf.ptr, 0u64, dir); let off: u64 = cstrinto(buf.ptr, 0u64, dir);
off = byteinto(buf.ptr, off, 47u8); off = byteinto(buf.ptr, off, 47u8);
off = cstrinto(buf.ptr, off, name); off = cstrinto(buf.ptr, off, name);
@@ -150,8 +151,8 @@ fn joinpath(dir: *u8, name: *u8) *u8 = {
// Same, but the second component is a ww `str` literal. // Same, but the second component is a ww `str` literal.
fn joinpathlit(dir: *u8, name: str) *u8 = { fn joinpathlit(dir: *u8, name: str) *u8 = {
let buf: []u8 = alloc([], PATH_MAX)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64))!;
buf.len = PATH_MAX: i32; buf.len = os.PATH_MAX;
let off: u64 = cstrinto(buf.ptr, 0u64, dir); let off: u64 = cstrinto(buf.ptr, 0u64, dir);
off = byteinto(buf.ptr, off, 47u8); off = byteinto(buf.ptr, off, 47u8);
off = strinto(buf.ptr, off, name); off = strinto(buf.ptr, off, name);
@@ -254,7 +255,7 @@ fn importpathform(name: *u8, namelen: u64) *u8 = {
// `foo/foo.ha` fallback; a module IS the directory). // `foo/foo.ha` fallback; a module IS the directory).
fn locatein(dir: *u8, dirlen: u64, fn locatein(dir: *u8, dirlen: u64,
pathform: *u8, pflen: u64, isdir: *i32) *u8 = { pathform: *u8, pflen: u64, isdir: *i32) *u8 = {
let buf: []u8 = alloc([], PATH_MAX)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64))!;
let off: u64 = 0u64; let off: u64 = 0u64;
let i: u64 = 0u64; let i: u64 = 0u64;
for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; }; for (i < dirlen) { buf[off + i] = dir[i]; i += 1u64; };
@@ -279,7 +280,7 @@ fn locatein(dir: *u8, dirlen: u64,
return buf.ptr; return buf.ptr;
}; };
let buf2: []u8 = alloc([], PATH_MAX)!; let buf2: []u8 = alloc([], (os.PATH_MAX: u64))!;
off = 0u64; off = 0u64;
i = 0u64; i = 0u64;
for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; }; for (i < dirlen) { buf2[off + i] = dir[i]; i += 1u64; };
@@ -724,8 +725,8 @@ fn makestem(stem: *u8, src: *u8) void = {
// Append a literal suffix to `stem` (which already lives in a buffer). // Append a literal suffix to `stem` (which already lives in a buffer).
fn appendlit(stem: *u8, suffix: str) *u8 = { fn appendlit(stem: *u8, suffix: str) *u8 = {
let buf: []u8 = alloc([], PATH_MAX)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64))!;
buf.len = PATH_MAX: i32; buf.len = os.PATH_MAX;
let off: u64 = cstrinto(buf.ptr, 0u64, stem); let off: u64 = cstrinto(buf.ptr, 0u64, stem);
off = strinto(buf.ptr, off, suffix); off = strinto(buf.ptr, off, suffix);
cstrseal(buf.ptr, off); cstrseal(buf.ptr, off);
@@ -761,8 +762,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
let l6: *u8 = joinpathlit(selfdir, "w6l_ww"); let l6: *u8 = joinpathlit(selfdir, "w6l_ww");
// Default lib search path: <selfdir>/../../lib // Default lib search path: <selfdir>/../../lib
let dotdotlib: []u8 = alloc([], PATH_MAX)!; let dotdotlib: []u8 = alloc([], (os.PATH_MAX: u64))!;
dotdotlib.len = PATH_MAX: i32; dotdotlib.len = os.PATH_MAX;
{ {
let off: u64 = cstrinto(dotdotlib.ptr, 0u64, selfdir); let off: u64 = cstrinto(dotdotlib.ptr, 0u64, selfdir);
off = strinto(dotdotlib.ptr, off, "/../../lib"); off = strinto(dotdotlib.ptr, off, "/../../lib");
@@ -775,8 +776,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
// convention assumes you're running from the module dir; our // convention assumes you're running from the module dir; our
// wrappers don't cd, so dirname(src) stands in as the closest // wrappers don't cd, so dirname(src) stands in as the closest
// analog. Source-dir wins ties over the system path (cc -I.). // analog. Source-dir wins ties over the system path (cc -I.).
let srcd: []u8 = alloc([], PATH_MAX)!; let srcd: []u8 = alloc([], (os.PATH_MAX: u64))!;
srcd.len = PATH_MAX: i32; srcd.len = os.PATH_MAX;
if (entryisdir != 0) { if (entryisdir != 0) {
let slen: u64 = cstrlen(src); let slen: u64 = cstrlen(src);
let k: u64 = 0u64; let k: u64 = 0u64;
@@ -810,8 +811,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
}; };
// Compose searchpath: srcd + ':' + incs + ':' + dotdotlib. // Compose searchpath: srcd + ':' + incs + ':' + dotdotlib.
let searchpath: []u8 = alloc([], PATH_MAX * 3u64)!; let searchpath: []u8 = alloc([], (os.PATH_MAX: u64) * 3u64)!;
searchpath.len = (PATH_MAX * 3u64): i32; searchpath.len = ((os.PATH_MAX: u64) * 3u64): i32;
{ {
let off: u64 = cstrinto(searchpath.ptr, 0u64, srcd.ptr); let off: u64 = cstrinto(searchpath.ptr, 0u64, srcd.ptr);
off = byteinto(searchpath.ptr, off, 58u8); // ':' off = byteinto(searchpath.ptr, off, 58u8); // ':'
@@ -825,8 +826,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
// Stem for .s/.o/.combined.ww side files. Dir entry: <dir>/<base>; // Stem for .s/.o/.combined.ww side files. Dir entry: <dir>/<base>;
// file entry: src stripped of .ww. // file entry: src stripped of .ww.
let stem: []u8 = alloc([], PATH_MAX)!; let stem: []u8 = alloc([], (os.PATH_MAX: u64))!;
stem.len = PATH_MAX: i32; stem.len = os.PATH_MAX;
if (entryisdir != 0) { if (entryisdir != 0) {
let dlen: u64 = cstrlen(srcd.ptr); let dlen: u64 = cstrlen(srcd.ptr);
let bo: u64 = basenameoff(srcd.ptr, dlen); let bo: u64 = basenameoff(srcd.ptr, dlen);
@@ -843,8 +844,8 @@ fn buildone(selfdir: *u8, src: *u8, entryisdir: i32, out: *u8, incs: *u8, lf: *l
let combined: *u8 = appendlit(stem.ptr, ".combined.ww"); let combined: *u8 = appendlit(stem.ptr, ".combined.ww");
// libwwrt.a path: <selfdir>/../lib/libwwrt.a // libwwrt.a path: <selfdir>/../lib/libwwrt.a
let libwwrt: []u8 = alloc([], PATH_MAX)!; let libwwrt: []u8 = alloc([], (os.PATH_MAX: u64))!;
libwwrt.len = PATH_MAX: i32; libwwrt.len = os.PATH_MAX;
{ {
let off: u64 = cstrinto(libwwrt.ptr, 0u64, selfdir); let off: u64 = cstrinto(libwwrt.ptr, 0u64, selfdir);
off = strinto(libwwrt.ptr, off, "/../lib/libwwrt.a"); off = strinto(libwwrt.ptr, off, "/../lib/libwwrt.a");
@@ -995,7 +996,7 @@ fn arenadupcstr(src: *u8, plen: u64) *u8 = {
// buildsearchpath — compose the colon-separated lookup path used by // buildsearchpath — compose the colon-separated lookup path used by
// resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib // resolvemodule's case (4). Order: "." : <incs> : <selfdir>/../../lib
fn buildsearchpath(selfdir: *u8, incs: *u8) *u8 = { fn buildsearchpath(selfdir: *u8, incs: *u8) *u8 = {
let buf: []u8 = alloc([], PATH_MAX * 2u64)!; let buf: []u8 = alloc([], (os.PATH_MAX: u64) * 2u64)!;
let off: u64 = 0u64; let off: u64 = 0u64;
buf[off] = 46u8; off += 1u64; // '.' buf[off] = 46u8; off += 1u64; // '.'
if (incs != nil) { if (incs != nil) {
@@ -1070,8 +1071,8 @@ fn defaultoutpath(src: *u8) *u8 = {
if (src[i] == 47u8) { start = i + 1u64; }; // '/' if (src[i] == 47u8) { start = i + 1u64; }; // '/'
i += 1u64; i += 1u64;
}; };
let out: []u8 = alloc([], PATH_MAX)!; let out: []u8 = alloc([], (os.PATH_MAX: u64))!;
out.len = PATH_MAX: i32; out.len = os.PATH_MAX;
let off: u64 = 0u64; let off: u64 = 0u64;
let j: u64 = start; let j: u64 = start;
for (j < n) { for (j < n) {
@@ -1095,8 +1096,8 @@ fn defaultoutpath(src: *u8) *u8 = {
fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = { fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
let src: *u8 = nil; let src: *u8 = nil;
let incs: []u8 = alloc([], PATH_MAX * 2u64)!; let incs: []u8 = alloc([], (os.PATH_MAX: u64) * 2u64)!;
incs.len = (PATH_MAX * 2u64): i32; incs.len = ((os.PATH_MAX: u64) * 2u64): i32;
let incoff: u64 = 0u64; let incoff: u64 = 0u64;
cstrseal(incs.ptr, 0u64); cstrseal(incs.ptr, 0u64);
@@ -1195,8 +1196,8 @@ fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
rlen -= 1u64; rlen -= 1u64;
}; };
let bo: u64 = basenameoff(resolved, rlen); let bo: u64 = basenameoff(resolved, rlen);
let outbuf: []u8 = alloc([], PATH_MAX)!; let outbuf: []u8 = alloc([], (os.PATH_MAX: u64))!;
outbuf.len = PATH_MAX: i32; outbuf.len = os.PATH_MAX;
out = outbuf.ptr; out = outbuf.ptr;
let i: u64 = bo; let i: u64 = bo;
let off: u64 = 0u64; let off: u64 = 0u64;
@@ -1246,8 +1247,8 @@ fn makeruntmp(buf: *u8) void = {
fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = { fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
let src: *u8 = nil; let src: *u8 = nil;
let passstart: i32 = -1; // first argv idx to pass through to program let passstart: i32 = -1; // first argv idx to pass through to program
let incs: []u8 = alloc([], PATH_MAX * 2u64)!; let incs: []u8 = alloc([], (os.PATH_MAX: u64) * 2u64)!;
incs.len = (PATH_MAX * 2u64): i32; incs.len = ((os.PATH_MAX: u64) * 2u64): i32;
let incoff: u64 = 0u64; let incoff: u64 = 0u64;
cstrseal(incs.ptr, 0u64); cstrseal(incs.ptr, 0u64);
@@ -1346,8 +1347,8 @@ fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
return 1; return 1;
}; };
let tmp: []u8 = alloc([], PATH_MAX)!; let tmp: []u8 = alloc([], (os.PATH_MAX: u64))!;
tmp.len = PATH_MAX: i32; tmp.len = os.PATH_MAX;
makeruntmp(tmp.ptr); makeruntmp(tmp.ptr);
let lf: lflags; let lf: lflags;
lf.libdirs = libdirs.ptr; lf.libdirs = libdirs.ptr;
@@ -1385,8 +1386,8 @@ fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
// report ok/FAIL per file, return 0 iff all pass. // report ok/FAIL per file, return 0 iff all pass.
fn runsingletest(selfdir: *u8, src: *u8) i32 = { fn runsingletest(selfdir: *u8, src: *u8) i32 = {
let tmp: []u8 = alloc([], PATH_MAX)!; let tmp: []u8 = alloc([], (os.PATH_MAX: u64))!;
tmp.len = PATH_MAX: i32; tmp.len = os.PATH_MAX;
makeruntmp(tmp.ptr); makeruntmp(tmp.ptr);
if (buildone(selfdir, src, 0, tmp.ptr, "\0".ptr, nil) != 0) { if (buildone(selfdir, src, 0, tmp.ptr, "\0".ptr, nil) != 0) {
os.remove(pathstr(tmp.ptr)); os.remove(pathstr(tmp.ptr));
@@ -1427,8 +1428,8 @@ fn rundirtests(selfdir: *u8, dir: *u8) i32 = {
if (cstrendswithlit(name, "_test.ww")) { if (cstrendswithlit(name, "_test.ww")) {
let nlen: u64 = cstrlen(name); let nlen: u64 = cstrlen(name);
// path = <dir>/<name> // path = <dir>/<name>
let path: []u8 = alloc([], PATH_MAX)!; let path: []u8 = alloc([], (os.PATH_MAX: u64))!;
path.len = PATH_MAX: i32; path.len = os.PATH_MAX;
let poff: u64 = cstrinto(path.ptr, 0u64, dir); let poff: u64 = cstrinto(path.ptr, 0u64, dir);
path[poff] = 47u8; poff += 1u64; path[poff] = 47u8; poff += 1u64;
let i: u64 = 0u64; let i: u64 = 0u64;
@@ -1436,12 +1437,12 @@ fn rundirtests(selfdir: *u8, dir: *u8) i32 = {
poff += nlen; poff += nlen;
cstrseal(path.ptr, poff); cstrseal(path.ptr, poff);
// incs = <dir> so test files can `use ` siblings // incs = <dir> so test files can `use ` siblings
let tincs: []u8 = alloc([], PATH_MAX)!; let tincs: []u8 = alloc([], (os.PATH_MAX: u64))!;
tincs.len = PATH_MAX: i32; tincs.len = os.PATH_MAX;
let ic: u64 = cstrinto(tincs.ptr, 0u64, dir); let ic: u64 = cstrinto(tincs.ptr, 0u64, dir);
cstrseal(tincs.ptr, ic); cstrseal(tincs.ptr, ic);
let tmp: []u8 = alloc([], PATH_MAX)!; let tmp: []u8 = alloc([], (os.PATH_MAX: u64))!;
tmp.len = PATH_MAX: i32; tmp.len = os.PATH_MAX;
makeruntmp(tmp.ptr); makeruntmp(tmp.ptr);
let bres: i32 = buildone(selfdir, path.ptr, 0, tmp.ptr, tincs.ptr, nil); let bres: i32 = buildone(selfdir, path.ptr, 0, tmp.ptr, tincs.ptr, nil);
if (bres != 0) { if (bres != 0) {
@@ -1507,9 +1508,9 @@ export fn main(argc: i32, argv: **u8) i32 = {
}; };
// selfdir = dirname(argv[0]) // selfdir = dirname(argv[0])
let selfdir: []u8 = alloc([], PATH_MAX)!; let selfdir: []u8 = alloc([], (os.PATH_MAX: u64))!;
selfdir.len = PATH_MAX: i32; selfdir.len = os.PATH_MAX;
selfdirinto(selfdir.ptr, PATH_MAX, argv[0]); selfdirinto(selfdir.ptr, (os.PATH_MAX: u64), argv[0]);
if (argc < 2) { if (argc < 2) {
writeusage(2); writeusage(2);