// 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()); } })();