Count the arguments a replaced stdio write receives (#2530)

This commit is contained in:
Chris Tate
2026-10-29 15:10:03 -05:00
committed by GitHub
4 changed files with 53 additions and 0 deletions
@@ -1062,6 +1062,9 @@ export function lambdaSignature(
type: DYN,
mode: "required",
}));
// `arguments` holds the call's own tuple: a console line passes one
// or two arguments whatever the replacement declares.
appendArgumentsParameter(lowerer, node, shapes, "arguments");
return { shapes, funcType: funcTypeFromParamShapes(shapes, DYN) };
}
}
@@ -0,0 +1,6 @@
{
"order": [
"<repo>/tests/corpus/stdio-write-replacement-arguments.cjs"
],
"diags": []
}
@@ -0,0 +1,43 @@
// A replaced process.stdout.write or process.stderr.write sees the call's own
// arguments: arguments.length is the number the caller passed, whatever the
// replacement declares.
const seen = [];
const originalOut = process.stdout.write;
process.stdout.write = function (chunk, encodingOrCallback, callback) {
seen.push(`stdout declared3 ${arguments.length} ${typeof callback}`);
return true;
};
process.stdout.write("one");
process.stdout.write("two", "utf8");
process.stdout.write("three", "utf8", () => {});
process.stdout.write = function () {
seen.push(`stdout declared0 ${arguments.length} ${arguments[0]}`);
return true;
};
process.stdout.write("zero");
process.stdout.write = function (chunk) {
seen.push(`stdout declared1 ${arguments.length} ${arguments[1]}`);
return true;
};
process.stdout.write("a", "latin1");
process.stdout.write = originalOut;
const originalErr = process.stderr.write;
process.stderr.write = function (chunk, encodingOrCallback, callback) {
seen.push(`stderr declared3 ${arguments.length} ${typeof callback}`);
return true;
};
process.stderr.write("one");
process.stderr.write("two", "utf8");
process.stderr.write("three", "utf8", () => {});
process.stderr.write = function () {
seen.push(`stderr declared0 ${arguments.length} ${arguments[0]}`);
return true;
};
process.stderr.write("zero");
process.stderr.write = function (chunk) {
seen.push(`stderr declared1 ${arguments.length} ${arguments[1]}`);
return true;
};
process.stderr.write("a", "latin1");
process.stderr.write = originalErr;
console.log(seen.join("\n"));
@@ -0,0 +1 @@
{ "plain": 3757, "san": 5000 }