1
1
// META: global=jsshell
2
2
// META: script=/wasm/jsapi/wasm-module-builder.js
3
3
4
- function Promising ( wasm_export ) {
5
- return WebAssembly . promising ( wasm_export ) ;
6
- }
7
-
8
- function Suspending ( jsFun ) {
9
- return new WebAssembly . Suspending ( jsFun ) ;
10
- }
11
-
12
4
// Test for invalid wrappers
13
5
test ( ( ) => {
14
6
assert_throws ( TypeError , ( ) => WebAssembly . promising ( { } ) ,
@@ -52,9 +44,9 @@ promise_test(async () => {
52
44
kExprLocalGet , 0 ,
53
45
kExprCallFunction , import_index , // suspend
54
46
] ) . exportFunc ( ) ;
55
- let js_import = Suspending ( ( ) => Promise . resolve ( 42 ) ) ;
47
+ let js_import = WebAssembly . Suspending ( ( ) => Promise . resolve ( 42 ) ) ;
56
48
let instance = builder . instantiate ( { m : { import : js_import } } ) ;
57
- let wrapped_export = Promising ( instance . exports . test ) ;
49
+ let wrapped_export = WebAssembly . promising ( instance . exports . test ) ;
58
50
let export_promise = wrapped_export ( ) ;
59
51
assert_true ( export_promise instanceof Promise ) ;
60
52
assert_equals ( await export_promise , 42 ) ;
@@ -91,9 +83,9 @@ promise_test(async () => {
91
83
function js_import ( ) {
92
84
return Promise . resolve ( ++ i ) ;
93
85
} ;
94
- let wasm_js_import = Suspending ( js_import ) ;
86
+ let wasm_js_import = WebAssembly . Suspending ( js_import ) ;
95
87
let instance = builder . instantiate ( { m : { import : wasm_js_import } } ) ;
96
- let wrapped_export = Promising ( instance . exports . test ) ;
88
+ let wrapped_export = WebAssembly . promising ( instance . exports . test ) ;
97
89
let export_promise = wrapped_export ( ) ;
98
90
assert_equals ( instance . exports . g . value , 0 ) ;
99
91
assert_true ( export_promise instanceof Promise ) ;
@@ -154,11 +146,11 @@ promise_test(async () => {
154
146
kExprCallFunction , import42_index , // suspend?
155
147
kExprCallFunction , importSetA_index
156
148
] ) . exportFunc ( ) ;
157
- let import42 = Suspending ( ( ) => Promise . resolve ( 42 ) ) ;
149
+ let import42 = WebAssembly . Suspending ( ( ) => Promise . resolve ( 42 ) ) ;
158
150
let instance = builder . instantiate ( { m : { import42 : import42 ,
159
151
setA :AbeforeB . setA } } ) ;
160
152
161
- let wrapped_export = Promising ( instance . exports . test ) ;
153
+ let wrapped_export = WebAssembly . promising ( instance . exports . test ) ;
162
154
163
155
// AbeforeB.showAbeforeB();
164
156
let exported_promise = wrapped_export ( ) ;
@@ -183,11 +175,11 @@ promise_test(async () => {
183
175
kExprCallFunction , import42_index , // suspend?
184
176
kExprCallFunction , importSetA_index
185
177
] ) . exportFunc ( ) ;
186
- let import42 = Suspending ( ( ) => 42 ) ;
178
+ let import42 = WebAssembly . Suspending ( ( ) => 42 ) ;
187
179
let instance = builder . instantiate ( { m : { import42 : import42 ,
188
180
setA :AbeforeB . setA } } ) ;
189
181
190
- let wrapped_export = Promising ( instance . exports . test ) ;
182
+ let wrapped_export = WebAssembly . promising ( instance . exports . test ) ;
191
183
192
184
let exported_promise = wrapped_export ( ) ;
193
185
AbeforeB . setB ( ) ;
@@ -213,10 +205,10 @@ test(t => {
213
205
function js_import ( ) {
214
206
return Promise . resolve ( ) ;
215
207
} ;
216
- let wasm_js_import = Suspending ( js_import ) ;
208
+ let wasm_js_import = WebAssembly . Suspending ( js_import ) ;
217
209
218
210
let instance = builder . instantiate ( { m : { import : wasm_js_import , tag : tag } } ) ;
219
- let wrapped_export = Promising ( instance . exports . test ) ;
211
+ let wrapped_export = WebAssembly . promising ( instance . exports . test ) ;
220
212
let export_promise = wrapped_export ( ) ;
221
213
assert_true ( export_promise instanceof Promise ) ;
222
214
promise_rejects ( t , new WebAssembly . Exception ( tag , [ ] ) , export_promise ) ;
@@ -239,10 +231,10 @@ promise_test(async (t) => {
239
231
function js_import ( ) {
240
232
return Promise . reject ( new WebAssembly . Exception ( tag , [ 42 ] ) ) ;
241
233
} ;
242
- let wasm_js_import = Suspending ( js_import ) ;
234
+ let wasm_js_import = WebAssembly . Suspending ( js_import ) ;
243
235
244
236
let instance = builder . instantiate ( { m : { import : wasm_js_import , tag : tag } } ) ;
245
- let wrapped_export = Promising ( instance . exports . test ) ;
237
+ let wrapped_export = WebAssembly . promising ( instance . exports . test ) ;
246
238
let export_promise = wrapped_export ( ) ;
247
239
assert_true ( export_promise instanceof Promise ) ;
248
240
assert_equals ( await export_promise , 42 ) ;
@@ -273,14 +265,14 @@ async function TestNestedSuspenders(suspend) {
273
265
kExprCallFunction , inner_index
274
266
] ) . exportFunc ( ) ;
275
267
276
- let inner = Suspending ( ( ) => suspend ? Promise . resolve ( 42 ) : 43 ) ;
268
+ let inner = WebAssembly . Suspending ( ( ) => suspend ? Promise . resolve ( 42 ) : 43 ) ;
277
269
278
270
let export_inner ;
279
- let outer = Suspending ( ( ) => export_inner ( ) ) ;
271
+ let outer = WebAssembly . Suspending ( ( ) => export_inner ( ) ) ;
280
272
281
273
let instance = builder . instantiate ( { m : { inner, outer} } ) ;
282
- export_inner = Promising ( instance . exports . inner ) ;
283
- let export_outer = Promising ( instance . exports . outer ) ;
274
+ export_inner = WebAssembly . promising ( instance . exports . inner ) ;
275
+ let export_outer = WebAssembly . promising ( instance . exports . outer ) ;
284
276
let result = export_outer ( ) ;
285
277
assert_true ( result instanceof Promise ) ;
286
278
if ( suspend )
@@ -310,11 +302,11 @@ test(() => {
310
302
. addBody ( [
311
303
kExprLocalGet , 0
312
304
] ) . exportFunc ( ) ;
313
- let js_import = Suspending ( ( ) => Promise . resolve ( 42 ) ) ;
305
+ let js_import = WebAssembly . Suspending ( ( ) => Promise . resolve ( 42 ) ) ;
314
306
let instance = builder . instantiate ( { m : { import : js_import } } ) ;
315
- let suspender = Promising ( instance . exports . return_suspender ) ( ) ;
307
+ let suspender = WebAssembly . promising ( instance . exports . return_suspender ) ( ) ;
316
308
for ( s of [ suspender , null , undefined , { } ] ) {
317
- assert_throws ( WebAssembly . RuntimeError , ( ) => instance . exports . test ( s ) ) ;
309
+ assert_throws ( WebAssembly . SuspendError , ( ) => instance . exports . test ( s ) ) ;
318
310
}
319
311
} , "Call import with an invalid suspender" ) ;
320
312
@@ -438,8 +430,7 @@ promise_test(async (t) => {
438
430
} } ) ;
439
431
// export1 (promising)
440
432
let wrapper = WebAssembly . promising ( instance . exports . export1 ) ;
441
- promise_rejects ( t , new WebAssembly . RuntimeError ( ) , wrapper ( ) ,
442
- / t r y i n g t o s u s p e n d J S f r a m e s / ) ;
433
+ promise_rejects ( t , new WebAssembly . SuspendError ( ) , wrapper ( ) ) ;
443
434
} ) ;
444
435
445
436
promise_test ( async ( ) => {
@@ -465,3 +456,31 @@ promise_test(async () => {
465
456
let wrapped_export = WebAssembly . promising ( instance2 . exports . main ) ;
466
457
assert_equals ( await wrapped_export ( ) , 3 ) ;
467
458
} ) ;
459
+
460
+ test ( ( ) => {
461
+ let builder = new WasmModuleBuilder ( ) ;
462
+ let js_tag = builder . addImportedTag ( "" , "tag" , kSig_v_r ) ;
463
+ try_sig_index = builder . addType ( kSig_i_v ) ;
464
+
465
+ let promise42 = new WebAssembly . Suspending ( ( ) => Promise . resolve ( 42 ) ) ;
466
+ let kPromise42Ref = builder . addImport ( "" , "promise42" , kSig_i_v ) ;
467
+
468
+ builder . addFunction ( "test" , kSig_i_v )
469
+ . addBody ( [
470
+ kExprTry , try_sig_index ,
471
+ kExprCallFunction , kPromise42Ref ,
472
+ kExprReturn , // If there was no trap or exception, return
473
+ kExprCatch , js_tag ,
474
+ kExprI32Const , 43 ,
475
+ kExprReturn ,
476
+ kExprEnd ,
477
+ ] )
478
+ . exportFunc ( ) ;
479
+
480
+ let instance = builder . instantiate ( { "" : {
481
+ promise42 : promise42 ,
482
+ tag : WebAssembly . JSTag ,
483
+ } } ) ;
484
+
485
+ assert_equals ( 43 , instance . exports . test ( ) ) ;
486
+ } , "catch the bad suspension" ) ;
0 commit comments