Files
scriptc/tests/corpus/stdio-write-replacement-arguments.cjs
T
Chris Tate b319186a68 Count the arguments a replaced stdio write receives
A JavaScript function assigned to process.stdout.write or
process.stderr.write takes its parameters from the call, not from Node's
overloads, but the lowering returned before giving the function its
arguments slot. `arguments.length` then folded to the declared parameter
count (3 for `function (chunk, encoding, callback)` called with one
argument, 0 for a function without parameters), and reading
`arguments[i]` was refused at run time.

The replacement now receives the call's arguments, so `arguments` holds
what the caller passed, as in Node.
2026-10-29 03:01:39 -05:00

44 lines
1.5 KiB
JavaScript

// 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"));