text: // Copyright 2019 the V8 project authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  // No reason to stress-opt this; save some time.
  // Flags: --no-stress-opt
  
  load('test/mjsunit/wasm/wasm-module-builder.js');
  
  // We generate the module bytes once to make this test more efficient,
  // especially on simulator builds. The bytes contain a sentinel which is later
  // patched to different constants. This makes the modules distinct and forces
  // the engine to create different code for them.
  
  // This is the sentinel placed in the bytes. It's a 5 byte LEB-encoded integer.
  const sentinel = wasmSignedLeb(0x12345678);
  assertEquals(5, sentinel.length);
  
  const builder = new WasmModuleBuilder();
  builder.addFunction('f', kSig_i_i).addBody([kExprI32Const, ...sentinel]);
  const module_bytes = builder.toBuffer();
  
  // Checks whether {module_bytes[i .. i+sentinel.length]} matches {sentinel}.
  const has_sentinel = (i, k = 0) => module_bytes[i + k] == sentinel[k] &&
      (k == sentinel.length - 1 || has_sentinel(i, k + 1));
  // Now find the sentinel.
  const find_sentinel = i =>
      module_bytes.slice(i).findIndex((e, i) => has_sentinel(i));
  const sentinel_position = find_sentinel(0);
  assertTrue(has_sentinel(sentinel_position), 'found sentinel');
  assertEquals(-1, find_sentinel(sentinel_position + 1), 'exactly one sentinel');
  
  // Generating {num_modules} modules should not run out of memory, since the code
  // space needed per module is quite low.
  const num_modules = 10000;
  // Keep all generated modules alive.
  const modules = [];
  // Reset sentinel section to nops so that shorter LEBs will just be followed by
  // nops. This resion will be patched in the loop with values of increasing size.
  module_bytes.set(Array(sentinel.length).fill(_ => kExprNop), sentinel_position);
  for (let i = 0; i < num_modules; ++i) {
    if (i % 50 == 0) print(i);
    module_bytes.set(wasmSignedLeb(i), sentinel_position);
    modules.push(new WebAssembly.Module(module_bytes));
  }
  