Files
scriptc/packages/compiler/test/buffer-from-dynamic.test.ts
Chris Tate 62e4317a21 Construct native Buffers from untyped input
- Compile Buffer.from for untyped strings, bytes, arrays, and plain array-like data.
- Preserve copy semantics, element coercion, and catchable errors while keeping unsupported object conversions explicit.
2026-09-28 08:37:22 -05:00

41 lines
1.5 KiB
TypeScript

import { spawnSync } from "node:child_process";
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { expect, test } from "vitest";
import { compile } from "../src/index.js";
test.each(["c", "llvm"] as const)("untyped Buffer inputs keep explicit object-boundary refusals (%s)", async (backend) => {
const dir = mkdtempSync(join(tmpdir(), "scriptc-buffer-from-"));
try {
const entry = join(dir, "main.cjs");
writeFileSync(entry, `
/** @param {unknown} value */
function from(value) { return Buffer.from(value); }
function attempt(value) {
try { from(value); }
catch (error) { console.log(error.name, error.message); }
}
attempt({ valueOf() { console.log("must not execute hook"); return "abc"; } });
class Input { length = 0; }
attempt(new Input());
console.log("after");
`);
const result = await compile(entry, {
backend, dynamic: false, sanitize: process.env["SCRIPTC_SAN"] === "1",
outDir: dir, outPath: join(dir, "program"),
});
expect(result.ok, JSON.stringify(result.diagnostics)).toBe(true);
if (!result.ok) return;
const child = spawnSync(result.binaryPath, [], { encoding: "utf8" });
expect(child.status).toBe(0);
expect(child.stderr).toBe("");
expect(child.stdout).toBe(
"Error Buffer.from with a custom valueOf is not supported yet\n" +
"Error Buffer.from with an opaque reference is not supported yet\nafter\n",
);
} finally {
rmSync(dir, { recursive: true, force: true });
}
});