@@ -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
0 commit comments