current commit
261028.1 · module: cache compiled WebAssembly modules in the compile cache
'use strict';

// This tests NODE_COMPILE_CACHE works for WebAssembly modules imported as ESM.

require('../common');
const { spawnSyncAndAssert } = require('../common/child_process');
const assert = require('assert');
const tmpdir = require('../common/tmpdir');
const fixtures = require('../common/fixtures');

const script = fixtures.path('es-modules', 'test-wasm-js-string-builtins.mjs');

// V8 only serializes optimized code, so a complete cache requires eager
// optimizing compilation.
{
  tmpdir.refresh();
  const dir = tmpdir.resolve('.compile_cache_dir');
  const flags = ['--no-liftoff', '--no-wasm-lazy-compilation', '--no-warnings'];

  spawnSyncAndAssert(
    process.execPath,
    [...flags, script],
    {
      env: {
        ...process.env,
        NODE_DEBUG_NATIVE: 'COMPILE_CACHE',
        NODE_COMPILE_CACHE: dir,
      },
      cwd: tmpdir.path,
    },
    {
      stderr(output) {
        assert.match(output, /no cache for Wasm .*js-string-builtins\.wasm/);
        assert.match(output, /V8 code cache for Wasm .*js-string-builtins\.wasm was not initialized, initializing the in-memory entry/);
        assert.match(output, /writing cache for Wasm .*js-string-builtins\.wasm.*success/);
        return true;
      },
    });

  spawnSyncAndAssert(
    process.execPath,
    [...flags, script],
    {
      env: {
        ...process.env,
        NODE_DEBUG_NATIVE: 'COMPILE_CACHE',
        NODE_COMPILE_CACHE: dir,
      },
      cwd: tmpdir.path,
    },
    {
      stderr(output) {
        assert.match(output, /reading cache from .* for Wasm .*js-string-builtins\.wasm.*success/);
        assert.match(output, /deserializing Wasm .*js-string-builtins\.wasm.*success/);
        assert.match(output, /skip persisting Wasm .*js-string-builtins\.wasm because cache was the same/);
        return true;
      },
    });
}

// With the default lazy baseline compilation there is no optimized code to
// cache at compile time, and no cache entry is written.
{
  tmpdir.refresh();
  const dir = tmpdir.resolve('.compile_cache_dir');

  spawnSyncAndAssert(
    process.execPath,
    ['--no-warnings', script],
    {
      env: {
        ...process.env,
        NODE_DEBUG_NATIVE: 'COMPILE_CACHE',
        NODE_COMPILE_CACHE: dir,
      },
      cwd: tmpdir.path,
    },
    {
      stderr(output) {
        assert.match(output, /nothing to serialize for Wasm .*js-string-builtins\.wasm/);
        assert.match(output, /skip persisting Wasm .*js-string-builtins\.wasm because the cache was not initialized/);
        return true;
      },
    });
}