Guard g10 directory staging

This commit is contained in:
2026-06-13 09:23:36 +08:00
parent a6baa14ddf
commit 8f47c95bca
3 changed files with 83 additions and 36 deletions

View File

@@ -1385,3 +1385,50 @@ wasm-port/tests/host/verify_host_smokes.sh
建议先处理 `g10`,因为 fixed manifest 已存在,当前只需把 initial/final aggregate
path guard 拆到每个 `writeG10RegressionFiles(...)` 调用附近。继续避免 blocked
runtime promotion、browser full inventory 扩面和 JS CNC 语义实现。
三十三、2026-06-13 继续执行记录g10 directory staging guard
本批处理 `g10` initial/final aggregate staged path guard将其拆到每个
`writeG10RegressionFiles(...)` 调用附近。
完成内容:
- Node 侧新增 `assertG10RegressionStaging(...)`
- Node 侧对每个 g10 fixture 目录的 vendored `.ngc/.tbl` 文件清单与 fixed manifest
精确对账;
- Node 侧检查 staged path 与 `/work/interp/g10/<name>/...` fixed manifest 一致;
- Node 侧移除 `g10` initial/final aggregate staged path guard
- browser 侧新增同名 helper检查 fixed manifest duplicate-free
- browser 侧检查 staged path 去掉 `/work/browser-interp/g10/<name>/` 前缀后与 fixed
manifest 一致;
- browser 侧移除 `g10` initial/final aggregate staged path guard仍不枚举目录
- 仅整理 host/filesystem staging guard不改变 G10、G92 或 tool table 语义。
已运行验证:
```bash
git diff --check
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
结果:全部通过。
下一步建议:
继续收敛 earlier direct-file guard。优先候选
- `do-while-break`
- `oword-bug315`
- `oword-bug315-p2`
- `exists`
- `return-value`
这些已有 Node/browser coverage 和 fixed `.ngc` manifest适合逐步复用
`assertInterpRegressionFileStaging(...)` 或小型 per-directory helper 替换内联 staged
path 对账。继续避免 blocked runtime promotion、browser full inventory 扩面和 JS CNC
语义实现。

View File

@@ -4755,6 +4755,16 @@
return wasmDir;
}
function assertG10RegressionStaging(name, files, wasmDir) {
if (files.length === 0 || new Set(files).size !== files.length) {
throw new Error(`browser_interp_g10_${name}_fixture_coverage: list drift`);
}
const g10StagedRelativeFiles = files.map((file) => `${wasmDir}/${file}`.replace(`/work/browser-interp/g10/${name}/`, ""));
if (g10StagedRelativeFiles.join(",") !== files.join(",")) {
throw new Error(`browser_interp_g10_${name}_staging_manifest: list drift`);
}
}
async function runVendorNcFile(interp, filename) {
const wasmPath = `/work/browser-nc-files/${filename}`;
await writeFetchedTextFile(
@@ -8439,6 +8449,7 @@
"test.ngc",
"test.tbl",
]);
assertG10RegressionStaging("g10-l1-l10", ["test.ngc", "test.tbl"], g10L1L10Dir);
verifyExpectedOutput(
"browser_interp_g10_l1_l10",
interp.runFileWithIni(`${g10L1L10Dir}/test.ngc`, `${g10L1L10Dir}/test.ini`),
@@ -8461,6 +8472,7 @@
"test.ngc",
"test.tbl",
]);
assertG10RegressionStaging("g10-l11", ["test.ngc", "test.tbl"], g10L11Dir);
verifyExpectedOutput(
"browser_interp_g10_l11",
interp.runFileWithIni(`${g10L11Dir}/test.ngc`, `${g10L11Dir}/test.ini`),
@@ -8482,14 +8494,7 @@
"g10-l2-while-active",
["test.ngc"],
);
const g10InitialStagedNgcFiles = [
`${g10L1L10Dir}/test.ngc`,
`${g10L11Dir}/test.ngc`,
`${g10L2WhileActiveDir}/test.ngc`,
].map((path) => path.replace("/work/browser-interp/g10/", ""));
if (g10InitialStagedNgcFiles.join(",") !== g10RegressionFiles.slice(0, 3).join(",")) {
throw new Error("browser_interp_g10_initial_staging_manifest: list drift");
}
assertG10RegressionStaging("g10-l2-while-active", ["test.ngc"], g10L2WhileActiveDir);
verifyExpectedOutput(
"browser_interp_g10_l2_while_active",
interp.runFile(`${g10L2WhileActiveDir}/test.ngc`),
@@ -8512,6 +8517,7 @@
"g10-l20-while-active",
["test.ngc"],
);
assertG10RegressionStaging("g10-l20-while-active", ["test.ngc"], g10L20WhileActiveDir);
verifyExpectedOutput(
"browser_interp_g10_l20_while_active",
interp.runFile(`${g10L20WhileActiveDir}/test.ngc`),
@@ -8532,13 +8538,7 @@
"test.ngc",
"test.tbl",
]);
const g10FinalStagedNgcFiles = [
`${g10L20WhileActiveDir}/test.ngc`,
`${g10WithG92Dir}/test.ngc`,
].map((path) => path.replace("/work/browser-interp/g10/", ""));
if (g10FinalStagedNgcFiles.join(",") !== g10RegressionFiles.slice(3, 5).join(",")) {
throw new Error("browser_interp_g10_final_staging_manifest: list drift");
}
assertG10RegressionStaging("g10-with-g92", ["test.ngc", "test.tbl"], g10WithG92Dir);
verifyExpectedOutput(
"browser_interp_g10_with_g92",
interp.runFileWithIni(`${g10WithG92Dir}/test.ngc`, `${g10WithG92Dir}/test.ini`),

View File

@@ -405,6 +405,22 @@ function writeG10RegressionFiles(name, files) {
return wasmDir;
}
function assertG10RegressionStaging(name, files, wasmDir) {
const sourceDir = resolve(rootDir, "vendor/linuxcnc/tests/interp/g10", name);
assert.deepEqual(
readdirSync(sourceDir)
.filter((filename) => filename.endsWith(".ngc") || filename.endsWith(".tbl"))
.sort(),
[...files].sort(),
`interp g10 ${name} fixture coverage drift`,
);
assert.deepEqual(
files.map((file) => `${wasmDir}/${file}`),
files.map((file) => `/work/interp/g10/${name}/${file}`),
`interp g10 ${name} staging manifest drift`,
);
}
function writeUserMCodeFixture(name, code) {
const wasmDir = `/work/user-m/${name}`;
const iniPath = `${wasmDir}/test.ini`;
@@ -3396,6 +3412,7 @@ assert.deepEqual(
);
const g10L1L10Dir = writeG10RegressionFiles("g10-l1-l10", ["test.ngc", "test.tbl"]);
assertG10RegressionStaging("g10-l1-l10", ["test.ngc", "test.tbl"], g10L1L10Dir);
verifyExpectedOutput(
"interp_g10_l1_l10_wasm",
interp.runFileWithIni(`${g10L1L10Dir}/test.ngc`, `${g10L1L10Dir}/test.ini`),
@@ -3415,6 +3432,7 @@ verifyExpectedOutput(
);
const g10L11Dir = writeG10RegressionFiles("g10-l11", ["test.ngc", "test.tbl"]);
assertG10RegressionStaging("g10-l11", ["test.ngc", "test.tbl"], g10L11Dir);
verifyExpectedOutput(
"interp_g10_l11_wasm",
interp.runFileWithIni(`${g10L11Dir}/test.ngc`, `${g10L11Dir}/test.ini`),
@@ -3432,17 +3450,7 @@ verifyExpectedOutput(
);
const g10L2WhileActiveDir = writeG10RegressionFiles("g10-l2-while-active", ["test.ngc"]);
assert.deepEqual(
[
`${g10L1L10Dir}/test.ngc`,
`${g10L11Dir}/test.ngc`,
`${g10L2WhileActiveDir}/test.ngc`,
],
g10RegressionFiles
.slice(0, 3)
.map((file) => `/work/interp/g10/${file}`),
"interp g10 initial staging manifest drift",
);
assertG10RegressionStaging("g10-l2-while-active", ["test.ngc"], g10L2WhileActiveDir);
verifyExpectedOutput(
"interp_g10_l2_while_active_wasm",
interp.runFile(`${g10L2WhileActiveDir}/test.ngc`),
@@ -3461,6 +3469,7 @@ verifyExpectedOutput(
);
const g10L20WhileActiveDir = writeG10RegressionFiles("g10-l20-while-active", ["test.ngc"]);
assertG10RegressionStaging("g10-l20-while-active", ["test.ngc"], g10L20WhileActiveDir);
verifyExpectedOutput(
"interp_g10_l20_while_active_wasm",
interp.runFile(`${g10L20WhileActiveDir}/test.ngc`),
@@ -3478,16 +3487,7 @@ verifyExpectedOutput(
);
const g10WithG92Dir = writeG10RegressionFiles("g10-with-g92", ["test.ngc", "test.tbl"]);
assert.deepEqual(
[
`${g10L20WhileActiveDir}/test.ngc`,
`${g10WithG92Dir}/test.ngc`,
],
g10RegressionFiles
.slice(3, 5)
.map((file) => `/work/interp/g10/${file}`),
"interp g10 final staging manifest drift",
);
assertG10RegressionStaging("g10-with-g92", ["test.ngc", "test.tbl"], g10WithG92Dir);
verifyExpectedOutput(
"interp_g10_with_g92_wasm",
interp.runFileWithIni(`${g10WithG92Dir}/test.ngc`, `${g10WithG92Dir}/test.ini`),