driver: ignore wrong-suffix files as named sources

This commit is contained in:
2026-08-23 03:18:19 +09:00
parent 59fc76964c
commit f6fabfc6ac
6 changed files with 1325 additions and 28 deletions

View File

@@ -8660,13 +8660,17 @@ fn basenameoff(p: *u8, plen: u64) u64 = {
return start;
};
fn sourceoperandnamed(path: *u8) bool = {
return cstrendswithlit(path, ".ww");
};
// A named Go source still passes through matchFile's leading-dot/underscore
// exclusion even when UseAllFiles bypasses platform suffixes and build tags.
// Inspect the public operand spelling so a hidden parent is not source identity
// and a hidden symlink spelling cannot be resurrected by a non-directory
// target's name or file kind.
fn sourceoperandignored(path: *u8) bool = {
if (!cstrendswithlit(path, ".ww")) { return false; };
if (!sourceoperandnamed(path)) { return false; };
let fi: os.filestat;
match (os.stat(&fi, pathstr(path))) {
case void => {
@@ -8741,13 +8745,6 @@ fn buildsearchpath(selfdir: *u8, incs: *u8) *u8 = {
fn resolvemodule(selfdir: *u8, name: *u8, incs: *u8, isdir: *i32) *u8 = {
let nlen: u64 = cstrlen(name);
if (cstrendswithlit(name, ".ww")) {
if (os.access(pathstr(name), 0i32) == 0) {
*isdir = 0;
return arenadupcstr(name, nlen);
};
};
let fi: os.filestat;
let sr: (void | os.oserror) = os.stat(&fi, pathstr(name));
let found: bool = false;
@@ -8760,10 +8757,16 @@ fn resolvemodule(selfdir: *u8, name: *u8, incs: *u8, isdir: *i32) *u8 = {
};
case let e: os.oserror => void;
};
if (found) {
if (foundisdir != 0) {
*isdir = foundisdir;
return arenadupcstr(name, nlen);
};
if (sourceoperandnamed(name)) {
if (os.access(pathstr(name), 0i32) == 0 || found) {
*isdir = 0;
return arenadupcstr(name, nlen);
};
};
if (reservedimportpath(name)) { return nil; };
let search: *u8 = buildsearchpath(selfdir, incs);
@@ -9043,9 +9046,11 @@ fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
let requestedstat: os.filestat;
match (os.stat(&requestedstat, pathstr(src))) {
case void => {
requestedliteral = true;
let typ: u32 = (requestedstat.mode: u32) & 61440u32;
requestednondirectory = typ != os.mode.DIR: u32;
requestedliteral = typ == os.mode.DIR: u32
|| sourceoperandnamed(src);
requestednondirectory = requestedliteral
&& typ != os.mode.DIR: u32;
};
case let e: os.oserror => void;
};
@@ -9071,7 +9076,7 @@ fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
let isdir: i32 = 0;
let resolved: *u8 = nil;
if (requestedliteral && !requestednondirectory
&& cstrendswithlit(src, ".ww")) {
&& sourceoperandnamed(src)) {
isdir = 1;
resolved = src;
} else {
@@ -9318,12 +9323,16 @@ fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
let requestedliteral: bool = false;
let requestedstat: os.filestat;
match (os.stat(&requestedstat, pathstr(src))) {
case void => requestedliteral = true;
case void => {
let typ: u32 = (requestedstat.mode: u32) & 61440u32;
requestedliteral = typ == os.mode.DIR: u32
|| sourceoperandnamed(src);
};
case let e: os.oserror => void;
};
if (requestedliteral
&& ((requestedstat.mode: u32) & 61440u32) == os.mode.DIR: u32
&& cstrendswithlit(src, ".ww")) {
&& sourceoperandnamed(src)) {
if (cstrendswithlit(src, "_test.ww")) {
cerrpath("ww: cannot run *_test.ww files (", src, ")\n");
} else {
@@ -9987,22 +9996,27 @@ fn dotest(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
let first: os.filestat;
let firstregular: bool = false;
let firstfound: bool = false;
let firstisdirphysical: bool = false;
match (os.stat(&first, pathstr(target))) {
case void => {
firstfound = true;
firstisdirphysical = ((first.mode: u32) & 61440u32)
== os.mode.DIR: u32;
firstregular = (((first.mode: u32) & 61440u32)
== (os.mode.REG: u32));
== (os.mode.REG: u32)) && sourceoperandnamed(target);
};
case let e: os.oserror => void;
};
if (!firstregular) {
let firstresolved: *u8 = nil;
let firstisdir: i32 = 0;
if (!firstfound) {
let firstlogical: bool = !firstfound
|| (!firstisdirphysical && !sourceoperandnamed(target));
if (firstlogical) {
firstresolved = resolvemodule(selfdir, target, incs.ptr,
&firstisdir);
};
if (firstfound || firstresolved == nil || firstisdir != 0) {
if (!firstlogical || firstresolved == nil || firstisdir != 0) {
let replacement: *u8 = nil;
let identity: *u8 = requestidentity;
if (firstisdir != 0) {
@@ -10049,7 +10063,9 @@ fn dotest(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
case void => {
let t: u32 = (fi.mode: u32) & 61440u32;
if (t == os.mode.DIR: u32) { isdir = 1; found = true; }
else { if (t == os.mode.REG: u32) { found = true; }; };
else { if (t == os.mode.REG: u32 && sourceoperandnamed(target)) {
found = true;
}; };
};
case let e: os.oserror => void;
};