• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// META: global=window,dedicatedworker,jsshell
2// META: script=/wasm/jsapi/wasm-module-builder.js
3// META: script=/wasm/jsapi/assertions.js
4// META: script=/wasm/jsapi/instanceTestFactory.js
5
6let emptyModuleBinary;
7setup(() => {
8  emptyModuleBinary = new WasmModuleBuilder().toBuffer();
9});
10
11promise_test(t => {
12  return promise_rejects_js(t, TypeError, WebAssembly.instantiate());
13}, "Missing arguments");
14
15promise_test(() => {
16  const fn = WebAssembly.instantiate;
17  const thisValues = [
18    undefined,
19    null,
20    true,
21    "",
22    Symbol(),
23    1,
24    {},
25    WebAssembly,
26  ];
27  return Promise.all(thisValues.map(thisValue => {
28    return fn.call(thisValue, emptyModuleBinary).then(assert_WebAssemblyInstantiatedSource);
29  }));
30}, "Branding");
31
32promise_test(t => {
33  const invalidArguments = [
34    undefined,
35    null,
36    true,
37    "",
38    Symbol(),
39    1,
40    {},
41    WebAssembly.Module,
42    WebAssembly.Module.prototype,
43    ArrayBuffer,
44    ArrayBuffer.prototype,
45    Array.from(emptyModuleBinary),
46  ];
47  return Promise.all(invalidArguments.map(argument => {
48    return promise_rejects_js(t, TypeError, WebAssembly.instantiate(argument),
49                           `instantiate(${format_value(argument)})`);
50  }));
51}, "Invalid arguments");
52
53test(() => {
54  const promise = WebAssembly.instantiate(emptyModuleBinary);
55  assert_equals(Object.getPrototypeOf(promise), Promise.prototype, "prototype");
56  assert_true(Object.isExtensible(promise), "extensibility");
57}, "Promise type");
58
59for (const [name, fn] of instanceTestFactory) {
60  promise_test(() => {
61    const { buffer, args, exports, verify } = fn();
62    return WebAssembly.instantiate(buffer, ...args).then(result => {
63      assert_WebAssemblyInstantiatedSource(result, exports);
64      verify(result.instance);
65    });
66  }, `${name}: BufferSource argument`);
67
68  promise_test(() => {
69    const { buffer, args, exports, verify } = fn();
70    const module = new WebAssembly.Module(buffer);
71    return WebAssembly.instantiate(module, ...args).then(instance => {
72      assert_Instance(instance, exports);
73      verify(instance);
74    });
75  }, `${name}: Module argument`);
76}
77
78promise_test(() => {
79  const builder = new WasmModuleBuilder();
80  builder.addImportedGlobal("module", "global", kWasmI32);
81  const buffer = builder.toBuffer();
82  const order = [];
83
84  const imports = {
85    get module() {
86      order.push("module getter");
87      return {
88        get global() {
89          order.push("global getter");
90          return 0;
91        },
92      }
93    },
94  };
95
96  const expected = [
97    "module getter",
98    "global getter",
99  ];
100  const p = WebAssembly.instantiate(buffer, imports);
101  assert_array_equals(order, []);
102  return p.then(result => {
103    assert_WebAssemblyInstantiatedSource(result);
104    assert_array_equals(order, expected);
105  });
106}, "Synchronous options handling: Buffer argument");
107
108promise_test(() => {
109  const builder = new WasmModuleBuilder();
110  builder.addImportedGlobal("module", "global", kWasmI32);
111  const buffer = builder.toBuffer();
112  const module = new WebAssembly.Module(buffer);
113  const order = [];
114
115  const imports = {
116    get module() {
117      order.push("module getter");
118      return {
119        get global() {
120          order.push("global getter");
121          return 0;
122        },
123      }
124    },
125  };
126
127  const expected = [
128    "module getter",
129    "global getter",
130  ];
131  const p = WebAssembly.instantiate(module, imports);
132  assert_array_equals(order, expected);
133  return p.then(instance => assert_Instance(instance, {}));
134}, "Synchronous options handling: Module argument");
135
136promise_test(t => {
137  const buffer = new Uint8Array();
138  return promise_rejects_js(t, WebAssembly.CompileError, WebAssembly.instantiate(buffer));
139}, "Empty buffer");
140
141promise_test(t => {
142  const buffer = new Uint8Array(Array.from(emptyModuleBinary).concat([0, 0]));
143  return promise_rejects_js(t, WebAssembly.CompileError, WebAssembly.instantiate(buffer));
144}, "Invalid code");
145
146promise_test(() => {
147  const buffer = new WasmModuleBuilder().toBuffer();
148  assert_equals(buffer[0], 0);
149  const promise = WebAssembly.instantiate(buffer);
150  buffer[0] = 1;
151  return promise.then(assert_WebAssemblyInstantiatedSource);
152}, "Changing the buffer");
153