@@ -52,7 +52,154 @@ describe('ESM: WASM modules', { concurrency: !process.env.TEST_PARALLEL }, () =>
52
52
[
53
53
'import { strictEqual } from "node:assert";' ,
54
54
`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
+ '}' ,
56
203
] . join ( '\n' ) ,
57
204
] ) ;
58
205
0 commit comments