◐ Shell
clean mode source ↗

esm: unwrap WebAssembly.Global on Wasm Namespaces · nodejs/node@767e88c

@@ -52,7 +52,154 @@ describe('ESM: WASM modules', { concurrency: !process.env.TEST_PARALLEL }, () =>

5252

[

5353

'import { strictEqual } from "node:assert";',

5454

`import * as wasmExports from ${JSON.stringify(fixtures.fileURL('es-modules/export-name-syntax-error.wasm'))};`,

55-

'assert.strictEqual(wasmExports["?f!o:o<b>a[r]"]?.value, 12682);',

55+

'assert.strictEqual(wasmExports["?f!o:o<b>a[r]"], 12682);',

56+

].join('\n'),

57+

]);

58+59+

strictEqual(stderr, '');

60+

strictEqual(stdout, '');

61+

strictEqual(code, 0);

62+

});

63+64+

it('should properly handle all WebAssembly global types', async () => {

65+

const { code, stderr, stdout } = await spawnPromisified(execPath, [

66+

'--no-warnings',

67+

'--experimental-wasm-modules',

68+

'--input-type=module',

69+

'--eval',

70+

[

71+

'import { strictEqual, deepStrictEqual, ok } from "node:assert";',

72+73+

// SIMD is not supported on rhel8-ppc64le

74+

'let wasmExports;',

75+

'try {',

76+

` wasmExports = await import(${JSON.stringify(fixtures.fileURL('es-modules/globals.wasm'))});`,

77+

'} catch (e) {',

78+

' ok(e instanceof WebAssembly.CompileError);',

79+

' ok(e.message.includes("SIMD unsupported"));',

80+

'}',

81+82+

'if (wasmExports) {',

83+84+

// Test imported globals using direct access

85+

' strictEqual(wasmExports.importedI32, 42);',

86+

' strictEqual(wasmExports.importedMutI32, 100);',

87+

' strictEqual(wasmExports.importedI64, 9223372036854775807n);',

88+

' strictEqual(wasmExports.importedMutI64, 200n);',

89+

' strictEqual(Math.round(wasmExports.importedF32 * 100000) / 100000, 3.14159);',

90+

' strictEqual(Math.round(wasmExports.importedMutF32 * 100000) / 100000, 2.71828);',

91+

' strictEqual(wasmExports.importedF64, 3.141592653589793);',

92+

' strictEqual(wasmExports.importedMutF64, 2.718281828459045);',

93+

' strictEqual(wasmExports.importedExternref !== null, true);',

94+

' strictEqual(wasmExports.importedMutExternref !== null, true);',

95+

' strictEqual(wasmExports.importedNullExternref, null);',

96+97+

// Test local globals exported directly

98+

' strictEqual(wasmExports[\'🚀localI32\'], 42);',

99+

' strictEqual(wasmExports.localMutI32, 100);',

100+

' strictEqual(wasmExports.localI64, 9223372036854775807n);',

101+

' strictEqual(wasmExports.localMutI64, 200n);',

102+

' strictEqual(Math.round(wasmExports.localF32 * 100000) / 100000, 3.14159);',

103+

' strictEqual(Math.round(wasmExports.localMutF32 * 100000) / 100000, 2.71828);',

104+

' strictEqual(wasmExports.localF64, 2.718281828459045);',

105+

' strictEqual(wasmExports.localMutF64, 3.141592653589793);',

106+107+

// Test imported globals using getter functions

108+

' strictEqual(wasmExports.getImportedMutI32(), 100);',

109+

' strictEqual(wasmExports.getImportedMutI64(), 200n);',

110+

' strictEqual(Math.round(wasmExports.getImportedMutF32() * 100000) / 100000, 2.71828);',

111+

' strictEqual(wasmExports.getImportedMutF64(), 2.718281828459045);',

112+

' strictEqual(wasmExports.getImportedMutExternref() !== null, true);',

113+114+

// Test local globals using getter functions

115+

' strictEqual(wasmExports.getLocalMutI32(), 100);',

116+

' strictEqual(wasmExports.getLocalMutI64(), 200n);',

117+

' strictEqual(Math.round(wasmExports.getLocalMutF32() * 100000) / 100000, 2.71828);',

118+

' strictEqual(wasmExports.getLocalMutF64(), 3.141592653589793);',

119+

' strictEqual(wasmExports.getLocalMutExternref(), null);',

120+121+

' assert.throws(wasmExports.getLocalMutV128);',

122+123+

// Pending TDZ support

124+

' strictEqual(wasmExports.depV128, undefined);',

125+126+

// Test modifying mutable globals and reading the new values

127+

' wasmExports.setImportedMutI32(999);',

128+

' strictEqual(wasmExports.getImportedMutI32(), 999);',

129+130+

' wasmExports.setImportedMutI64(888n);',

131+

' strictEqual(wasmExports.getImportedMutI64(), 888n);',

132+133+

' wasmExports.setImportedMutF32(7.77);',

134+

' strictEqual(Math.round(wasmExports.getImportedMutF32() * 100) / 100, 7.77);',

135+136+

' wasmExports.setImportedMutF64(6.66);',

137+

' strictEqual(wasmExports.getImportedMutF64(), 6.66);',

138+139+

// Test modifying mutable externref

140+

' const testObj = { test: "object" };',

141+

' wasmExports.setImportedMutExternref(testObj);',

142+

' strictEqual(wasmExports.getImportedMutExternref(), testObj);',

143+144+

// Test modifying local mutable globals

145+

' wasmExports.setLocalMutI32(555);',

146+

' strictEqual(wasmExports.getLocalMutI32(), 555);',

147+148+

' wasmExports.setLocalMutI64(444n);',

149+

' strictEqual(wasmExports.getLocalMutI64(), 444n);',

150+151+

' wasmExports.setLocalMutF32(3.33);',

152+

' strictEqual(Math.round(wasmExports.getLocalMutF32() * 100) / 100, 3.33);',

153+154+

' wasmExports.setLocalMutF64(2.22);',

155+

' strictEqual(wasmExports.getLocalMutF64(), 2.22);',

156+157+

// These mutating pending live bindings support

158+

' strictEqual(wasmExports.localMutI32, 100);',

159+

' strictEqual(wasmExports.localMutI64, 200n);',

160+

' strictEqual(Math.round(wasmExports.localMutF32 * 100) / 100, 2.72);',

161+

' strictEqual(wasmExports.localMutF64, 3.141592653589793);',

162+163+

// Test modifying local mutable externref

164+

' const anotherTestObj = { another: "test object" };',

165+

' wasmExports.setLocalMutExternref(anotherTestObj);',

166+

' strictEqual(wasmExports.getLocalMutExternref(), anotherTestObj);',

167+

' strictEqual(wasmExports.localMutExternref, null);',

168+169+

// Test dep.wasm imports

170+

' strictEqual(wasmExports.depI32, 1001);',

171+

' strictEqual(wasmExports.depMutI32, 2001);',

172+

' strictEqual(wasmExports.getDepMutI32(), 2001);',

173+

' strictEqual(wasmExports.depI64, 10000000001n);',

174+

' strictEqual(wasmExports.depMutI64, 20000000001n);',

175+

' strictEqual(wasmExports.getDepMutI64(), 20000000001n);',

176+

' strictEqual(Math.round(wasmExports.depF32 * 100) / 100, 10.01);',

177+

' strictEqual(Math.round(wasmExports.depMutF32 * 100) / 100, 20.01);',

178+

' strictEqual(Math.round(wasmExports.getDepMutF32() * 100) / 100, 20.01);',

179+

' strictEqual(wasmExports.depF64, 100.0001);',

180+

' strictEqual(wasmExports.depMutF64, 200.0001);',

181+

' strictEqual(wasmExports.getDepMutF64(), 200.0001);',

182+183+

// Test modifying dep.wasm mutable globals

184+

' wasmExports.setDepMutI32(3001);',

185+

' strictEqual(wasmExports.getDepMutI32(), 3001);',

186+187+

' wasmExports.setDepMutI64(30000000001n);',

188+

' strictEqual(wasmExports.getDepMutI64(), 30000000001n);',

189+190+

' wasmExports.setDepMutF32(30.01);',

191+

' strictEqual(Math.round(wasmExports.getDepMutF32() * 100) / 100, 30.01);',

192+193+

' wasmExports.setDepMutF64(300.0001);',

194+

' strictEqual(wasmExports.getDepMutF64(), 300.0001);',

195+196+

// These pending live bindings support

197+

' strictEqual(wasmExports.depMutI32, 2001);',

198+

' strictEqual(wasmExports.depMutI64, 20000000001n);',

199+

' strictEqual(Math.round(wasmExports.depMutF32 * 100) / 100, 20.01);',

200+

' strictEqual(wasmExports.depMutF64, 200.0001);',

201+202+

'}',

56203

].join('\n'),

57204

]);

58205