From 69c1d43a909a953309ead8f4edd5a411c09e2319 Mon Sep 17 00:00:00 2001 From: Fedor Indutny <238531+indutny@users.noreply.github.com> Date: Sat, 19 Apr 2025 08:25:09 -0700 Subject: [PATCH] feat: wasm support Add support for building and testing wasm target: ``` WASM=/opt/homebrew/Cellar/emscripten/4.0.6/libexec/llvm/bin/clang \ WASM_CFLAGS='-lc -nodefaultlibs --target=wasm32-wasi \ --sysroot=/opt/homebrew/Cellar/wasi-libc/25/share/wasi-sysroot' \ npm test ``` --- .github/workflows/ci.yaml | 8 +- lib/fixture.d.ts | 1 + lib/fixture.js | 73 ++++++++++++---- lib/fixture.js.map | 2 +- lib/result.js | 12 ++- lib/result.js.map | 2 +- src/binding.js | 80 ----------------- src/fixture.ts | 77 +++++++++++++---- src/helper.js | 176 -------------------------------------- src/native/fixture.c | 134 +++++++++++++++++++++-------- src/result.ts | 15 +++- src/wasm-runner.js | 49 +++++++++++ test/fixtures/extra.c | 3 +- test/fixtures/extra.js | 12 --- 14 files changed, 293 insertions(+), 351 deletions(-) delete mode 100644 src/binding.js delete mode 100644 src/helper.js create mode 100644 src/wasm-runner.js delete mode 100644 test/fixtures/extra.js diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a7e004d..3915d52 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,13 +29,13 @@ jobs: echo "C:\Users\runneradmin\scoop\shims" >> $Env:GITHUB_PATH - name: Fetch code - uses: actions/checkout@v2 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: fetch-depth: 1 # Skip macOS & Windows, cache there is slower - name: Restore node_modules cache for Linux - uses: actions/cache@v1 + uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4 if: runner.os == 'Linux' with: path: ~/.npm @@ -54,12 +54,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Fetch code - uses: actions/checkout@v2 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: fetch-depth: 1 - name: Restore node_modules cache - uses: actions/cache@v1 + uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} diff --git a/lib/fixture.d.ts b/lib/fixture.d.ts index 1306e08..f9cd0c5 100644 --- a/lib/fixture.d.ts +++ b/lib/fixture.d.ts @@ -3,6 +3,7 @@ export { FixtureResult, IFixtureResultOptions }; export interface IFixtureOptions { readonly buildDir: string; readonly clang?: string; + readonly wasm?: string; readonly extra?: ReadonlyArray; readonly maxParallel?: number; } diff --git a/lib/fixture.js b/lib/fixture.js index 8622c9c..36dcf9f 100644 --- a/lib/fixture.js +++ b/lib/fixture.js @@ -10,6 +10,8 @@ const result_1 = require("./result"); Object.defineProperty(exports, "FixtureResult", { enumerable: true, get: function () { return result_1.FixtureResult; } }); const CLANG = process.env.CLANG || 'clang'; const CFLAGS = process.env.CFLAGS || ''; +const WASM = process.env.WASM; +const WASM_CFLAGS = process.env.WASM_CFLAGS || ''; const NATIVE_DIR = path.join(__dirname, '..', 'src', 'native'); const FIXTURE = path.join(NATIVE_DIR, 'fixture.c'); // Just a random value, really @@ -20,6 +22,7 @@ class Fixture { this.options = { buildDir: options.buildDir, clang: options.clang === undefined ? CLANG : options.clang, + wasm: options.wasm === undefined ? WASM : options.wasm, extra: options.extra || [], maxParallel: options.maxParallel === undefined ? os.cpus().length : @@ -43,22 +46,41 @@ class Fixture { const commonArgs = [ '-g3', '-Os', '-fvisibility=hidden', '-I', NATIVE_DIR, + '-I', BUILD_DIR, '-include', header, FIXTURE, ]; + const args = { + c: ['-msse4.2'], + wasm: [ + '-msimd128', + '-fno-exceptions', + '-mexec-model=reactor', + '-Wl,-error-limit=0', + '-Wl,--allow-undefined', + '-Wl,--export-dynamic', + '-Wl,--export-table', + '-Wl,--export=malloc', + '-Wl,--export=free', + '-Wl,--no-entry', + ], + }; // This is rather lame, but should work if (CFLAGS) { for (const flag of CFLAGS.split(/\s+/g)) { - commonArgs.push(flag); + args.c.push(flag); + } + } + if (WASM_CFLAGS) { + for (const flag of WASM_CFLAGS.split(/\s+/g)) { + args.wasm.push(flag); } } - const args = { - c: ['-I', BUILD_DIR], - }; hash.update('c'); hash.update(artifacts.c); await fs.promises.writeFile(c, artifacts.c); args.c.push(c); + args.wasm.push(c); for (const extra of this.options.extra) { commonArgs.push(extra); } @@ -71,23 +93,40 @@ class Fixture { hash.update(commonArgs.join(' ')); const digest = hash.digest('hex'); const executables = []; - const out = path.join(BUILD_DIR, name + '-c.' + digest); - const link = path.join(BUILD_DIR, name + '-c'); - if (!fs.existsSync(out)) { - await this.clang(commonArgs.concat(args.c, '-o', out)); - } - try { - await fs.promises.unlink(link); + { + const out = path.join(BUILD_DIR, name + '-c.' + digest); + const link = path.join(BUILD_DIR, name + '-c'); + if (!fs.existsSync(out)) { + await this.clang(this.options.clang, commonArgs.concat(args.c, '-o', out)); + } + try { + await fs.promises.unlink(link); + } + catch (e) { + // no-op + } + await fs.promises.link(out, link); + executables.push(out); } - catch (e) { - // no-op + if (this.options.wasm) { + const out = path.join(BUILD_DIR, name + '-' + digest + '.wasm'); + const link = path.join(BUILD_DIR, name + '.wasm'); + if (!fs.existsSync(out)) { + await this.clang(this.options.wasm, commonArgs.concat(args.wasm, '-o', out)); + } + try { + await fs.promises.unlink(link); + } + catch (e) { + // no-op + } + await fs.promises.link(out, link); + executables.push(out); } - await fs.promises.link(out, link); - executables.push(out); return new result_1.FixtureResult(executables, this.options.maxParallel); } - async clang(args) { - const proc = (0, node_child_process_1.spawn)(CLANG, args, { + async clang(bin, args) { + const proc = (0, node_child_process_1.spawn)(bin, args, { stdio: [null, 'pipe', 'pipe'], }); const stdout = []; diff --git a/lib/fixture.js.map b/lib/fixture.js.map index 12ecc18..c9fab3a 100644 --- a/lib/fixture.js.map +++ b/lib/fixture.js.map @@ -1 +1 @@ -{"version":3,"file":"fixture.js","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"fixture.js","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/result.js b/lib/result.js index a4d142d..b88b73a 100644 --- a/lib/result.js +++ b/lib/result.js @@ -4,6 +4,7 @@ exports.FixtureResult = void 0; const assert = require("node:assert"); const node_child_process_1 = require("node:child_process"); const path = require("node:path"); +const WASM_RUNNER = path.join(__dirname, '..', 'src', 'wasm-runner.js'); class FixtureResult { executables; maxParallel; @@ -45,10 +46,17 @@ class FixtureResult { } async spawnSingle(executable, range, input) { const name = path.basename(executable); - const proc = (0, node_child_process_1.spawn)(executable, [ + let bin = executable; + const args = [ `${range.from}:${range.to}`, input, - ], { + ]; + if (executable.endsWith('.wasm')) { + bin = process.execPath; + args.unshift(executable); + args.unshift(WASM_RUNNER); + } + const proc = (0, node_child_process_1.spawn)(bin, args, { shell: process.platform === 'win32', stdio: [null, 'pipe', 'pipe'], }); diff --git a/lib/result.js.map b/lib/result.js.map index 49bb1c1..cbeb359 100644 --- a/lib/result.js.map +++ b/lib/result.js.map @@ -1 +1 @@ -{"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/binding.js b/src/binding.js deleted file mode 100644 index 9d121eb..0000000 --- a/src/binding.js +++ /dev/null @@ -1,80 +0,0 @@ -import { format } from 'node:util'; - -export default (binding, inBench) => { - // Just a random value, really - binding.LLPARSE__ERROR_PAUSE = 0x7fa73caa; - - let globalOff = 0; - binding.setGlobalOff = (value) => globalOff = value; - - const translate = (off) => off + globalOff; - - const nop = () => 0; - binding.llparse__print = inBench ? nop : (off, fmt, ...params) => { - const parts = [ - format('off=%d', translate(off)), - format(fmt, ...params), - ]; - console.log(parts.join(' ').trim()); - return 0; - }; - - binding.llparse__print_span = inBench ? nop : (name, buf, off, end) => { - let last = off; - - const printRegular = (current) => { - if (last !== current) { - binding.llparse__print(last, 'len=%d span[%s]="%s"', - current - last, name, buf.slice(last, current).toString()); - } - }; - - // Empty span - if (off === end) { - binding.llparse__print(off, 'len=0 span[%s]=""', name); - return 0; - } - - for (let i = off; i < end; i++) { - const ch = buf[i]; - - if (ch === 0xd) { - printRegular(i); - - binding.llparse__print(i, 'len=1 span[%s]=cr', name); - last = i + 1; - continue; - - // LF - } else if (ch === 0xa) { - printRegular(i); - - binding.llparse__print(i, 'len=1 span[%s]=lf', name); - last = i + 1; - continue; - } - - // Nothing to do here - } - - // Trailing data - printRegular(end); - - return 0; - }; - - binding.debug = inBench ? nop : (_, buf, off, msg) => { - if (off === buf.length) { - // tslint:disable-next-line:no-console - console.error(format('off=%d next=null debug=%s', translate(off), msg)); - } else { - let next = buf[off + 1].toString(16); - if (next.length < 2) { - next = '0' + next; - } - // tslint:disable-next-line:no-console - console.error(format('off=%d next=%s debug=%s', translate(off), - next, msg)); - } - }; -}; diff --git a/src/fixture.ts b/src/fixture.ts index 39ff3ec..091716f 100644 --- a/src/fixture.ts +++ b/src/fixture.ts @@ -10,6 +10,8 @@ export { FixtureResult, IFixtureResultOptions }; const CLANG = process.env.CLANG || 'clang'; const CFLAGS = process.env.CFLAGS || ''; +const WASM = process.env.WASM; +const WASM_CFLAGS = process.env.WASM_CFLAGS || ''; const NATIVE_DIR = path.join(__dirname, '..', 'src', 'native'); const FIXTURE = path.join(NATIVE_DIR, 'fixture.c'); @@ -17,6 +19,7 @@ const FIXTURE = path.join(NATIVE_DIR, 'fixture.c'); export interface IFixtureOptions { readonly buildDir: string; readonly clang?: string; + readonly wasm?: string; readonly extra?: ReadonlyArray; readonly maxParallel?: number; } @@ -33,6 +36,7 @@ export interface IFixtureArtifacts { interface IFixtureInternalOptions { readonly buildDir: string; readonly clang: string; + readonly wasm: string | undefined; readonly extra: ReadonlyArray; readonly maxParallel: number; } @@ -47,6 +51,7 @@ export class Fixture { this.options = { buildDir: options.buildDir, clang: options.clang === undefined ? CLANG : options.clang, + wasm: options.wasm === undefined ? WASM : options.wasm, extra: options.extra || [], maxParallel: options.maxParallel === undefined ? os.cpus().length : @@ -76,25 +81,44 @@ export class Fixture { const commonArgs = [ '-g3', '-Os', '-fvisibility=hidden', '-I', NATIVE_DIR, + '-I', BUILD_DIR, '-include', header, FIXTURE, ]; + const args = { + c: [ '-msse4.2' ], + wasm: [ + '-msimd128', + '-fno-exceptions', + '-mexec-model=reactor', + '-Wl,-error-limit=0', + '-Wl,--allow-undefined', + '-Wl,--export-dynamic', + '-Wl,--export-table', + '-Wl,--export=malloc', + '-Wl,--export=free', + '-Wl,--no-entry', + ], + }; + // This is rather lame, but should work if (CFLAGS) { for (const flag of CFLAGS.split(/\s+/g)) { - commonArgs.push(flag); + args.c.push(flag); + } + } + if (WASM_CFLAGS) { + for (const flag of WASM_CFLAGS.split(/\s+/g)) { + args.wasm.push(flag); } } - - const args = { - c: [ '-I', BUILD_DIR ], - }; hash.update('c'); hash.update(artifacts.c); await fs.promises.writeFile(c, artifacts.c); args.c.push(c); + args.wasm.push(c); for (const extra of this.options.extra) { commonArgs.push(extra); @@ -111,24 +135,43 @@ export class Fixture { const executables: string[] = []; - const out = path.join(BUILD_DIR, name + '-c.' + digest); - const link = path.join(BUILD_DIR, name + '-c'); - if (!fs.existsSync(out)) { - await this.clang(commonArgs.concat(args.c, '-o', out)); + { + const out = path.join(BUILD_DIR, name + '-c.' + digest); + const link = path.join(BUILD_DIR, name + '-c'); + if (!fs.existsSync(out)) { + await this.clang( + this.options.clang, commonArgs.concat(args.c, '-o', out)); + } + try { + await fs.promises.unlink(link); + } catch (e) { + // no-op + } + await fs.promises.link(out, link); + executables.push(out); } - try { - await fs.promises.unlink(link); - } catch (e) { - // no-op + + if (this.options.wasm) { + const out = path.join(BUILD_DIR, name + '-' + digest + '.wasm'); + const link = path.join(BUILD_DIR, name + '.wasm'); + if (!fs.existsSync(out)) { + await this.clang( + this.options.wasm, commonArgs.concat(args.wasm, '-o', out)); + } + try { + await fs.promises.unlink(link); + } catch (e) { + // no-op + } + await fs.promises.link(out, link); + executables.push(out); } - await fs.promises.link(out, link); - executables.push(out); return new FixtureResult(executables, this.options.maxParallel); } - private async clang(args: ReadonlyArray): Promise { - const proc = spawn(CLANG, args, { + private async clang(bin: string, args: ReadonlyArray): Promise { + const proc = spawn(bin, args, { stdio: [ null, 'pipe', 'pipe' ], }); diff --git a/src/helper.js b/src/helper.js deleted file mode 100644 index 750fde9..0000000 --- a/src/helper.js +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env node -import * as path from 'node:path'; - -import * as yargs from 'yargs'; - -import DEFAULT_BINDING from '../src/binding'; - -const argv = yargs - .option('parser', { - alias: 'p', - describe: 'Parser to use', - type: 'string', - }) - .option('binding', { - alias: 'b', - describe: 'Binding to use', - type: 'string', - }) - .option('init', { - alias: 'i', - describe: 'The name of function from the binding to be used at init', - type: 'string', - }) - .demandOption([ 'parser' ]) - .string('_') - .command('bench ', 'benchmark input', (yargs) => { - return yargs.positional('input', { - type: 'string', - coerce(opt) { - return opt; - }, - }); - }) - .command('* ', 'scan input', (yargs) => { - return yargs - .positional('range', { type: 'string' }) - .positional('input', { type: 'string' }); - }) - .help('h') - .alias('help', 'h') - .argv; - -const IS_BENCH = argv._[0] === 'bench'; - -const PARSER_FILE = path.resolve(argv.parser); -const EXTRA_BINDINGS = argv.binding ? - Array.isArray(argv.binding) ? argv.binding : [ argv.binding ] - : - []; - -function runOne(binding, p, buf, globalOff = 0) { - let paused = false; - let code; - - binding.setGlobalOff(globalOff); - - let off = 0; - for (;;) { - code = p.execute(off === 0 ? buf : buf.slice(off)); - if (code !== binding.LLPARSE__ERROR_PAUSE) { - break; - } - - if (paused && p.errorOff === 0) { - binding.llparse__debug(p, buf, off, 'Can\'t make progress after pause'); - return -1; - } - - off += p.errorOff; - binding.setGlobalOff(globalOff + off); - - binding.llparse__print(0, 'pause'); - - // Resume - p.error = 0; - paused = true; - } - - if (code !== 0) { - if (code !== p.error) { - binding.llparse__print(p.errorOff, - 'error code mismatch got=%d expected=%d', code, p.error); - return -1; - } - - binding.llparse__print(p.errorOff, "error code=%d reason=\"%s\"", code, - p.reason); - } - - return code; -} - -function benchmark(binding, Parser, input) { - const buf = Buffer.from(input); - - // JS is slower than C, use less bytes - const TOTAL = 4 * 1024 * 1024 * 1024; - const ITERATIONS = (TOTAL / buf.length) >>> 0; - - const p = new Parser(); - if (argv.init) { - binding[argv.init](p); - } - - const start = Date.now(); - for (let i = 0; i < ITERATIONS; i++) { - const code = runOne(binding, p, buf); - if (code !== 0) { - console.error('got error code %d', code); - } - } - const end = Date.now(); - - const secs = (end - start) / 1000; - - const size = (TOTAL / 1024 / 1024).toFixed(2); - const bandwidth = (TOTAL / secs / 1024 / 1024).toFixed(2); - const ops = (ITERATIONS / secs).toFixed(2); - - console.log('%s mb | %s mb/s | %s ops/sec | %s s', - size, bandwidth, ops, secs.toFixed(2)); -} - -function scan(binding, Parser, range, input) { - const buf = Buffer.from(input); - - const [ from, to ] = range.split(':', 2).map((x) => parseInt(x, 10) | 0); - if (from < 1 || to < from) { - throw new Error('Invalid range'); - } - - for (let scan = from; scan < to; scan++) { - console.log('===== SCAN %d START =====', scan); - - const p = new Parser(); - if (argv.init) { - binding[argv.init](p); - } - for (let off = 0; off < buf.length; off += scan) { - if (runOne(binding, p, buf.slice(off, off + scan), off) !== 0) { - break; - } - } - } -} - -async function main() { - // Load bindings - const bindings = [ DEFAULT_BINDING ]; - for (const extra of EXTRA_BINDINGS) { - const m = (await import(path.resolve(extra))).default; - bindings.push(m.default || m); - } - - // Apply bindings - const binding = {}; - for (const apply of bindings) { - apply(binding, IS_BENCH); - } - - // Import parser - const init = (await import(PARSER_FILE)).default; - const Parser = init(binding); - - if (IS_BENCH) { - benchmark(binding, Parser, argv.input); - } else { - scan(binding, Parser, argv.range, argv.input); - } -} - -main().then(() => { -}).catch((e) => { - console.error(e.stack); - process.exit(1); -}); diff --git a/src/native/fixture.c b/src/native/fixture.c index 1dc5ae3..ce8f701 100644 --- a/src/native/fixture.c +++ b/src/native/fixture.c @@ -7,7 +7,34 @@ #include "fixture.h" -#if defined(_MSC_VER) +#if defined(__wasm__) + extern double wasm_get_time(); + extern void wasm_print(int stream, const char* str); + + static int wasm__stdout = 0; + static int wasm__stderr = 1; + + static double get_time() { + return wasm_get_time(); + } + + static void wasm__printf(int stream, const char* fmt, ...) { + va_list ap; + char buf[16384]; + + if (llparse__in_bench) + return; + + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + + wasm_print(stream, buf); + } + + #define fprintf(stream, ...) wasm__printf(wasm__##stream, __VA_ARGS__) + +#elif defined(_MSC_VER) #if defined(_MSC_EXTENSIONS) #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 #else @@ -16,10 +43,7 @@ #include - static int gettimeofday(struct timeval* tv, void* tz) { - assert(tv != NULL); - assert(tz == NULL); - + static double get_time() { FILETIME ft; unsigned __int64 tmpres = 0; @@ -32,13 +56,18 @@ tmpres /= 10; /*convert into microseconds*/ /*converting file time to unix epoch*/ tmpres -= DELTA_EPOCH_IN_MICROSECS; - tv->tv_sec = (long)(tmpres / 1000000UL); - tv->tv_usec = (long)(tmpres % 1000000UL); - return 0; + return (double) tmpres / 1e6; } #else #include + + static double get_time() { + struct timeval tv; + gettimeofday(&tv, NULL); + + return (double) tv.tv_sec + tv.tv_usec * 1e-6; + } #endif /* defined(_MSC_VER) */ #ifdef LLPARSE__TEST_INIT @@ -215,8 +244,8 @@ static int llparse__run_loop(const char* input, int len) { static int llparse__run_bench(const char* input, int len) { llparse_t s; int64_t i; - struct timeval start; - struct timeval end; + double start; + double end; double bw; double time; double total; @@ -229,7 +258,7 @@ static int llparse__run_bench(const char* input, int len) { iterations = kBytes / (int64_t) len; - gettimeofday(&start, NULL); + start = get_time(); for (i = 0; i < iterations; i++) { int code; @@ -237,14 +266,13 @@ static int llparse__run_bench(const char* input, int len) { if (code != 0) return code; } - gettimeofday(&end, NULL); + end = get_time(); #ifdef LLPARSE__TEST_FINISH LLPARSE__TEST_FINISH(&s); #endif /* LLPARSE__TEST_FINISH */ - time = (end.tv_sec - start.tv_sec); - time += (double) (end.tv_usec - start.tv_usec) * 1e-6; + time = end - start; total = (double) iterations * len; bw = (double) total / time; @@ -294,6 +322,7 @@ static int llparse__run_scan(int scan, const char* input, int len) { } +#if !defined(__wasm__) static int llparse__run_stdin() { llparse_t s; @@ -325,19 +354,24 @@ static int llparse__run_stdin() { return 0; } +#endif /* !defined(__wasm__) */ -static int llparse__print_usage(char** argv) { +static int llparse__print_usage(const char* exec) { fprintf(stderr, "Usage:\n"); - fprintf(stderr, " %s :to [input]\n", argv[0]); - fprintf(stderr, " %s bench [input]\n", argv[0]); - fprintf(stderr, " %s -\n", argv[0]); + fprintf(stderr, " %s :to [input]\n", exec); + fprintf(stderr, " %s bench [input]\n", exec); +#if !defined(__wasm__) + fprintf(stderr, " %s -\n", exec); +#endif /* !defined(__wasm__) */ return -1; } -int main(int argc, char** argv) { - const char* input; +#if defined(__wasm__) +__attribute__((visibility("default"))) +#endif /* !defined(__wasm__) */ +int run(const char* exec, const char* spec, const char* input) { int len; struct { int from; @@ -345,35 +379,47 @@ int main(int argc, char** argv) { } scan; int i; - if (argc >= 2 && strcmp(argv[1], "-") == 0) - return llparse__run_stdin(); - - if (argc < 3) - return llparse__print_usage(argv); - - if (strcmp(argv[1], "bench") == 0) { + if (strcmp(spec, "bench") == 0) { llparse__in_bench = 1; - } else if (strcmp(argv[1], "loop") == 0) { + } else if (strcmp(spec, "loop") == 0) { llparse__in_bench = 1; llparse__in_loop = 1; } else { const char* colon; - char* endptr; + const char* p; - colon = strchr(argv[1], ':'); + p = spec; + colon = strchr(p, ':'); if (colon == NULL) - return llparse__print_usage(argv); + return llparse__print_usage(exec); - scan.from = (int) strtol(argv[1], &endptr, 10); - if (endptr != colon) - return llparse__print_usage(argv); + scan.from = 0; + scan.to = 0; - scan.to = (int) strtol(colon + 1, &endptr, 10); - if (endptr != argv[1] + strlen(argv[1])) - return llparse__print_usage(argv); + while (p < colon) { + char ch = *p; + if (ch < '0' || ch > '9') { + return llparse__print_usage(exec); + } + scan.from *= 10; + scan.from += ch - '0'; + p++; + } + p++; + while (1) { + char ch = *p; + if (ch == 0) { + break; + } + if (ch < '0' || ch > '9') { + return llparse__print_usage(exec); + } + scan.to *= 10; + scan.to += ch - '0'; + p++; + } } - input = argv[2]; len = strlen(input); if (llparse__in_bench && len == 0) { @@ -400,3 +446,15 @@ int main(int argc, char** argv) { return 0; } + +#if !defined(__wasm__) +int main(int argc, char** argv) { + if (argc >= 2 && strcmp(argv[1], "-") == 0) + return llparse__run_stdin(); + + if (argc < 3) + return llparse__print_usage(argv[0]); + + return run(argv[0], argv[1], argv[2]); +} +#endif /* !defined(__wasm__) */ diff --git a/src/result.ts b/src/result.ts index 83c4212..c638621 100644 --- a/src/result.ts +++ b/src/result.ts @@ -4,6 +4,8 @@ import * as path from 'node:path'; export type FixtureExpected = string | RegExp | ReadonlyArray; +const WASM_RUNNER = path.join(__dirname, '..', 'src', 'wasm-runner.js'); + interface IRange { readonly from: number; readonly to: number; @@ -63,10 +65,19 @@ export class FixtureResult { private async spawnSingle(executable: string, range: IRange, input: string): Promise { const name = path.basename(executable); - const proc = spawn(executable, [ + let bin = executable; + const args = [ `${range.from}:${range.to}`, input, - ], { + ]; + + if (executable.endsWith('.wasm')) { + bin = process.execPath; + args.unshift(executable); + args.unshift(WASM_RUNNER); + } + + const proc = spawn(bin, args, { shell: process.platform === 'win32', stdio: [ null, 'pipe', 'pipe' ], }); diff --git a/src/wasm-runner.js b/src/wasm-runner.js new file mode 100644 index 0000000..a430cce --- /dev/null +++ b/src/wasm-runner.js @@ -0,0 +1,49 @@ +const fs = require('node:fs'); + +async function main() { + const [, , wasmPath, spec, input] = process.argv; + console.error(wasmPath); + + const wasm = fs.readFileSync(wasmPath); + + const mod = await WebAssembly.compile(wasm) + const { exports: { malloc, run, memory } } = await WebAssembly.instantiate(mod, { + wasi_snapshot_preview1: { + fd_write: () => { + throw new Error('not implemented'); + }, + fd_seek: () => { + throw new Error('not implemented'); + }, + fd_close: () => { + throw new Error('not implemented'); + }, + }, + env: { + wasm_print: (stream, ptr) => { + const start = Buffer.from(memory.buffer).slice(ptr); + const end = start.indexOf(0); + const str = start.slice(0, end).toString(); + if (stream === 0) { + process.stdout.write(str); + } else { + process.stderr.write(str); + } + }, + wasm_get_time: () => Date.now(), + } + }); + + function str(value) { + const buf = Buffer.from(value); + const ptr = malloc(buf.byteLength + 1); + new Uint8Array(memory.buffer, ptr, buf.byteLength + 1).set(buf); + return ptr; + } + + run(str('wasm'), str(spec), input ? str(input) : 0); +} +main().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/test/fixtures/extra.c b/test/fixtures/extra.c index 38aacf3..112fbaf 100644 --- a/test/fixtures/extra.c +++ b/test/fixtures/extra.c @@ -1,7 +1,8 @@ #include "fixture.h" -void llparse__print_off(llparse_t* s, const char* p, const char* endp) { +int llparse__print_off(llparse_t* s, const char* p, const char* endp) { llparse__print(p, endp, ""); + return 0; } diff --git a/test/fixtures/extra.js b/test/fixtures/extra.js deleted file mode 100644 index 6a6bac1..0000000 --- a/test/fixtures/extra.js +++ /dev/null @@ -1,12 +0,0 @@ -export default (binding, inBench) => { - const nop = () => 0; - - binding.llparse__print_off = inBench ? nop : (_, buf, off) => { - binding.llparse__print(off, ''); - return 0; - }; - - binding.llparse__on_span = inBench ? nop : (_, buf, off, offLen) => { - return binding.llparse__print_span('span', buf, off, offLen); - }; -};