asm-heap.js 2.89 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
// Copyright 2018 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.

// Flags: --validate-asm --allow-natives-syntax --expose-gc --mock-arraybuffer-allocator

let gCounter = 1000;
let gMinHeap = new ArrayBuffer(1 << 12);
let gStdlib = {Uint8Array: Uint8Array};

// The template of asm.js modules used in this test.
function Template(stdlib, ffi, heap) {
  "use asm";
  var MEM8 = new stdlib.Uint8Array(heap);
  function foo() { return VAL; }
  return { foo: foo };
}

// Create a fresh module each time.
function NewModule() {
  // Use eval() to get a unique module each time.
  let val = gCounter++;
  let string = (Template + "; Template").replace("VAL", "" + val);
//  print(string);
  let module = eval(string);
//  print(module);
  module(gStdlib, {}, gMinHeap);
  assertTrue(%IsAsmWasmCode(module));
  return {module: module, val: val};
}

(function TestValid_PowerOfTwo() {
  print("TestValid_PowerOfTwo...");
  let r = NewModule();
  for (let i = 12; i <= 24; i++) {
    gc();  // Likely OOM otherwise.
    let size = 1 << i;
    print("  size=" + size);
    let heap = new ArrayBuffer(size);
    var instance = r.module(gStdlib, {}, heap);
    assertTrue(%IsAsmWasmCode(r.module));
    assertEquals(r.val, instance.foo());
  }
})();

(function TestValid_Multiple() {
  print("TestValid_Multiple...");
  let r = NewModule();
  for (let i = 1; i < 47; i += 7) {
    gc();  // Likely OOM otherwise.
    let size = i * (1 << 24);
    print("  size=" + size);
    let heap = new ArrayBuffer(size);
    var instance = r.module(gStdlib, {}, heap);
    assertTrue(%IsAsmWasmCode(r.module));
    assertEquals(r.val, instance.foo());
  }
})();

(function TestInvalid_TooSmall() {
  print("TestInvalid_TooSmall...");
  for (let i = 1; i < 12; i++) {
    let size = 1 << i;
    print("  size=" + size);
    let r = NewModule();
    let heap = new ArrayBuffer(size);
    var instance = r.module(gStdlib, {}, heap);
    assertFalse(%IsAsmWasmCode(r.module));
    assertEquals(r.val, instance.foo());
  }
})();

(function TestInValid_NonPowerOfTwo() {
  print("TestInvalid_NonPowerOfTwo...");
  for (let i = 12; i <= 24; i++) {
    gc();  // Likely OOM otherwise.
    let size = 1 + (1 << i);
    print("  size=" + size);
    let r = NewModule();
    let heap = new ArrayBuffer(size);
    var instance = r.module(gStdlib, {}, heap);
    assertFalse(%IsAsmWasmCode(r.module));
    assertEquals(r.val, instance.foo());
  }
})();

(function TestInValid_NonMultiple() {
  print("TestInvalid_NonMultiple...");
  for (let i = (1 << 24); i < (1 << 25); i += (1 << 22)) {
    gc();  // Likely OOM otherwise.
    let size = i + (1 << 20);
    print("  size=" + size);
    let r = NewModule();
    let heap = new ArrayBuffer(size);
    var instance = r.module(gStdlib, {}, heap);
    assertFalse(%IsAsmWasmCode(r.module));
    assertEquals(r.val, instance.foo());
  }
})();