5608526bc2fa905203e274c42a6d6be2e161b443
[WebKit-https.git] / JSTests / wasm / js-api / extension-MemoryMode.js
1 import Builder from '../Builder.js';
2 import * as assert from '../assert.js';
3
4 const iterations = 32;
5 const verbose = false;
6
7 // This API isn't part of WebAssembly's official spec. It is use for testing within the shell.
8
9 const version = 0x01;
10 const emptyModuleArray = Uint8Array.of(0x0, 0x61, 0x73, 0x6d, version, 0x00, 0x00, 0x00);
11
12 assert.isFunction(WebAssemblyMemoryMode);
13
14 const message = `WebAssemblyMemoryMode expects either a WebAssembly.Memory or WebAssembly.Instance`;
15 assert.throws(() => WebAssemblyMemoryMode(null), TypeError, message);
16 assert.throws(() => WebAssemblyMemoryMode(undefined), TypeError, message);
17 assert.throws(() => WebAssemblyMemoryMode(1), TypeError, message);
18 assert.throws(() => WebAssemblyMemoryMode(""), TypeError, message);
19 assert.throws(() => WebAssemblyMemoryMode({}), TypeError, message);
20 assert.throws(() => WebAssemblyMemoryMode(new WebAssembly.Module(emptyModuleArray)), TypeError, message);
21 assert.throws(() => WebAssemblyMemoryMode(new WebAssembly.Table({initial: 1, element: "anyfunc"})), TypeError, message);
22
23 const validateMode = what => {
24     const mode = WebAssemblyMemoryMode(what);
25     if (verbose)
26         print(`    ${mode}`);
27     switch (mode) {
28     case "Signaling":
29         break;
30     case "BoundsChecking":
31         break;
32     default:
33         throw new Error(`Unexpected WebAssembly.Memory mode '${mode}'`);
34     }
35     return what;
36 }
37
38 const instantiate = builder => {
39     const bin = builder.WebAssembly();
40     const module = new WebAssembly.Module(bin.get());
41     return new WebAssembly.Instance(module);
42 };
43
44 (function testMemoryNoMax() {
45     if (verbose)
46         print(`testMemoryNoMax`);
47     let memories = [];
48     for (let i = 0; i != iterations; ++i)
49         memories.push(validateMode(new WebAssembly.Memory({ initial: i })));
50     return memories;
51 })();
52
53 fullGC();
54
55 (function testMemory() {
56     if (verbose)
57         print(`testMemory`);
58     let memories = [];
59     for (let i = 0; i != iterations; ++i)
60         memories.push(validateMode(new WebAssembly.Memory({ initial: i, maximum: i })));
61     return memories;
62 })();
63
64 fullGC();
65
66 (function testInstanceNoMemory() {
67     if (verbose)
68         print(`testInstanceNoMemory`);
69     let instances = [];
70     for (let i = 0; i != iterations; ++i) {
71         const builder = (new Builder())
72               .Type().End()
73               .Function().End()
74               .Code().End();
75         const instance = instantiate(builder);
76         // No-memory instances should never be Signaling: it would be wasteful.
77         assert.eq(WebAssemblyMemoryMode(instance), "BoundsChecking");
78         if (verbose)
79             print(`    ${WebAssemblyMemoryMode(instance)}`);
80         instances.push(instance);
81     }
82     return instances;
83 })();
84
85 fullGC();
86
87 (function testInstanceNoMax() {
88     if (verbose)
89         print(`testInstanceNoMax`);
90     let instances = [];
91     for (let i = 0; i != iterations; ++i) {
92         // Note: not exported! The internal API can still access.
93         const builder = (new Builder())
94               .Type().End()
95               .Function().End()
96               .Memory().InitialMaxPages(i).End()
97               .Code().End();
98         instances.push(validateMode(instantiate(builder)));
99     }
100 })();
101
102 fullGC();
103
104 (function testInstance() {
105     if (verbose)
106         print(`testInstance`);
107     let instances = [];
108     for (let i = 0; i != iterations; ++i) {
109         // Note: not exported! The internal API can still access.
110         const builder = (new Builder())
111               .Type().End()
112               .Function().End()
113               .Memory().InitialMaxPages(i, i).End()
114               .Code().End();
115         instances.push(validateMode(instantiate(builder)));
116     }
117 })();