blob: 2f13b2c1da3ce12bbda7ee12bbe3d71080744fd4 [file] [log] [blame]
import Builder from '../Builder.js';
import * as assert from '../assert.js';
const iterations = 32;
const verbose = false;
// This API isn't part of WebAssembly's official spec. It is use for testing within the shell.
const version = 0x01;
const emptyModuleArray = Uint8Array.of(0x0, 0x61, 0x73, 0x6d, version, 0x00, 0x00, 0x00);
assert.isFunction(WebAssemblyMemoryMode);
const message = `WebAssemblyMemoryMode expects either a WebAssembly.Memory or WebAssembly.Instance`;
assert.throws(() => WebAssemblyMemoryMode(null), TypeError, message);
assert.throws(() => WebAssemblyMemoryMode(undefined), TypeError, message);
assert.throws(() => WebAssemblyMemoryMode(1), TypeError, message);
assert.throws(() => WebAssemblyMemoryMode(""), TypeError, message);
assert.throws(() => WebAssemblyMemoryMode({}), TypeError, message);
assert.throws(() => WebAssemblyMemoryMode(new WebAssembly.Module(emptyModuleArray)), TypeError, message);
assert.throws(() => WebAssemblyMemoryMode(new WebAssembly.Table({initial: 1, element: "funcref"})), TypeError, message);
const validateMode = what => {
const mode = WebAssemblyMemoryMode(what);
if (verbose)
print(` ${mode}`);
switch (mode) {
case "Signaling":
break;
case "BoundsChecking":
break;
default:
throw new Error(`Unexpected WebAssembly.Memory mode '${mode}'`);
}
return what;
}
const instantiate = builder => {
const bin = builder.WebAssembly();
const module = new WebAssembly.Module(bin.get());
return new WebAssembly.Instance(module);
};
(function testMemoryNoMax() {
if (verbose)
print(`testMemoryNoMax`);
let memories = [];
for (let i = 0; i != iterations; ++i)
memories.push(validateMode(new WebAssembly.Memory({ initial: i })));
return memories;
})();
fullGC();
(function testMemory() {
if (verbose)
print(`testMemory`);
let memories = [];
for (let i = 0; i != iterations; ++i)
memories.push(validateMode(new WebAssembly.Memory({ initial: i, maximum: i })));
return memories;
})();
fullGC();
(function testInstanceNoMemory() {
if (verbose)
print(`testInstanceNoMemory`);
let instances = [];
for (let i = 0; i != iterations; ++i) {
const builder = (new Builder())
.Type().End()
.Function().End()
.Code().End();
const instance = instantiate(builder);
// No-memory instances should never be Signaling: it would be wasteful.
assert.eq(WebAssemblyMemoryMode(instance), "BoundsChecking");
if (verbose)
print(` ${WebAssemblyMemoryMode(instance)}`);
instances.push(instance);
}
return instances;
})();
fullGC();
(function testInstanceNoMax() {
if (verbose)
print(`testInstanceNoMax`);
let instances = [];
for (let i = 0; i != iterations; ++i) {
// Note: not exported! The internal API can still access.
const builder = (new Builder())
.Type().End()
.Function().End()
.Memory().InitialMaxPages(i).End()
.Code().End();
instances.push(validateMode(instantiate(builder)));
}
})();
fullGC();
(function testInstance() {
if (verbose)
print(`testInstance`);
let instances = [];
for (let i = 0; i != iterations; ++i) {
// Note: not exported! The internal API can still access.
const builder = (new Builder())
.Type().End()
.Function().End()
.Memory().InitialMaxPages(i, i).End()
.Code().End();
instances.push(validateMode(instantiate(builder)));
}
})();