|
13 | 13 | (import "fuzzing-support" "table-set" (func $table.set (param i32 funcref)))
|
14 | 14 | (import "fuzzing-support" "table-get" (func $table.get (param i32) (result funcref)))
|
15 | 15 |
|
16 |
| - (import "fuzzing-support" "call-export" (func $call.export (param i32))) |
| 16 | + (import "fuzzing-support" "call-export" (func $call.export (param i32 i32))) |
17 | 17 | (import "fuzzing-support" "call-export-catch" (func $call.export.catch (param i32) (result i32)))
|
18 | 18 |
|
19 |
| - (import "fuzzing-support" "call-ref" (func $call.ref (param funcref))) |
| 19 | + (import "fuzzing-support" "call-ref" (func $call.ref (param funcref i32))) |
20 | 20 | (import "fuzzing-support" "call-ref-catch" (func $call.ref.catch (param funcref) (result i32)))
|
21 | 21 |
|
22 | 22 | (import "fuzzing-support" "sleep" (func $sleep (param i32 i32) (result i32)))
|
|
110 | 110 | ;; At index 0 in the exports we have $logging, so we will do those loggings.
|
111 | 111 | (call $call.export
|
112 | 112 | (i32.const 0)
|
| 113 | + ;; First bit unset in the flags means a normal call. |
| 114 | + (i32.const 0) |
| 115 | + ) |
| 116 | + ;; At index 999 we have nothing, so we'll error. |
| 117 | + (call $call.export |
| 118 | + (i32.const 999) |
| 119 | + (i32.const 0) |
| 120 | + ) |
| 121 | + ) |
| 122 | + |
| 123 | + ;; CHECK: [fuzz-exec] calling export.calling.rethrow |
| 124 | + ;; CHECK-NEXT: [LoggingExternalInterface logging 42] |
| 125 | + ;; CHECK-NEXT: [LoggingExternalInterface logging 3.14159] |
| 126 | + ;; CHECK-NEXT: [exception thrown: imported-js-tag externref] |
| 127 | + (func $export.calling.rethrow (export "export.calling.rethrow") |
| 128 | + ;; As above, but the second param is different. |
| 129 | + (call $call.export |
| 130 | + (i32.const 0) |
| 131 | + ;; First bit set in the flags means a catch+rethrow. There is no visible |
| 132 | + ;; effect here, but there might be in JS VMs. |
| 133 | + (i32.const 1) |
113 | 134 | )
|
114 | 135 | ;; At index 999 we have nothing, so we'll error.
|
115 | 136 | (call $call.export
|
116 | 137 | (i32.const 999)
|
| 138 | + (i32.const 1) |
117 | 139 | )
|
118 | 140 | )
|
119 | 141 |
|
|
146 | 168 | ;; This will emit some logging.
|
147 | 169 | (call $call.ref
|
148 | 170 | (ref.func $logging)
|
| 171 | + ;; Normal call. |
| 172 | + (i32.const 0) |
| 173 | + ) |
| 174 | + ;; This will throw. |
| 175 | + (call $call.ref |
| 176 | + (ref.null func) |
| 177 | + (i32.const 0) |
| 178 | + ) |
| 179 | + ) |
| 180 | + |
| 181 | + ;; CHECK: [fuzz-exec] calling ref.calling.rethrow |
| 182 | + ;; CHECK-NEXT: [LoggingExternalInterface logging 42] |
| 183 | + ;; CHECK-NEXT: [LoggingExternalInterface logging 3.14159] |
| 184 | + ;; CHECK-NEXT: [exception thrown: imported-js-tag externref] |
| 185 | + (func $ref.calling.rethrow (export "ref.calling.rethrow") |
| 186 | + ;; As with calling an export, when we set the flags to 1 exceptions are |
| 187 | + ;; caught and rethrown, but there is no noticeable difference here. |
| 188 | + (call $call.ref |
| 189 | + (ref.func $logging) |
| 190 | + (i32.const 1) |
149 | 191 | )
|
150 | 192 | ;; This will throw.
|
151 | 193 | (call $call.ref
|
152 | 194 | (ref.null func)
|
| 195 | + (i32.const 1) |
153 | 196 | )
|
154 | 197 | )
|
155 | 198 |
|
|
195 | 238 | ;; logging from the function, "12".
|
196 | 239 | (call $call.ref
|
197 | 240 | (ref.func $legal)
|
| 241 | + (i32.const 1) |
198 | 242 | )
|
199 | 243 | )
|
200 | 244 |
|
|
335 | 379 |
|
336 | 380 | ;; CHECK: [fuzz-exec] calling do-sleep
|
337 | 381 | ;; CHECK-NEXT: [fuzz-exec] note result: do-sleep => 42
|
338 |
| - ;; CHECK-NEXT: warning: no passes specified, not doing any work |
339 | 382 | (func $do-sleep (export "do-sleep") (result i32)
|
340 | 383 | (call $sleep
|
341 | 384 | ;; A ridiculous amount of ms, but in the interpreter it is ignored anyhow.
|
|
344 | 387 | (i32.const 42)
|
345 | 388 | )
|
346 | 389 | )
|
| 390 | + |
| 391 | + ;; CHECK: [fuzz-exec] calling return-externref-exception |
| 392 | + ;; CHECK-NEXT: [fuzz-exec] note result: return-externref-exception => object |
| 393 | + ;; CHECK-NEXT: warning: no passes specified, not doing any work |
| 394 | + (func $return-externref-exception (export "return-externref-exception") (result externref) |
| 395 | + ;; Call JS table.set in a way that throws (on out of bounds). The JS exception |
| 396 | + ;; is caught and returned from the function, so we can see what it looks like |
| 397 | + ;; to the fuzzer, which should be "object" (an exception object). |
| 398 | + (block $block (result externref) |
| 399 | + (try_table (catch $imported-js-tag $block) |
| 400 | + (call $table.set |
| 401 | + (i32.const 99990) |
| 402 | + (ref.null func) |
| 403 | + ) |
| 404 | + ) |
| 405 | + (unreachable) |
| 406 | + ) |
| 407 | + ) |
347 | 408 | )
|
348 | 409 | ;; CHECK: [fuzz-exec] calling logging
|
349 | 410 | ;; CHECK-NEXT: [LoggingExternalInterface logging 42]
|
|
368 | 429 | ;; CHECK-NEXT: [LoggingExternalInterface logging 3.14159]
|
369 | 430 | ;; CHECK-NEXT: [exception thrown: imported-js-tag externref]
|
370 | 431 |
|
| 432 | +;; CHECK: [fuzz-exec] calling export.calling.rethrow |
| 433 | +;; CHECK-NEXT: [LoggingExternalInterface logging 42] |
| 434 | +;; CHECK-NEXT: [LoggingExternalInterface logging 3.14159] |
| 435 | +;; CHECK-NEXT: [exception thrown: imported-js-tag externref] |
| 436 | + |
371 | 437 | ;; CHECK: [fuzz-exec] calling export.calling.catching
|
372 | 438 | ;; CHECK-NEXT: [LoggingExternalInterface logging 42]
|
373 | 439 | ;; CHECK-NEXT: [LoggingExternalInterface logging 3.14159]
|
|
379 | 445 | ;; CHECK-NEXT: [LoggingExternalInterface logging 3.14159]
|
380 | 446 | ;; CHECK-NEXT: [exception thrown: imported-js-tag externref]
|
381 | 447 |
|
| 448 | +;; CHECK: [fuzz-exec] calling ref.calling.rethrow |
| 449 | +;; CHECK-NEXT: [LoggingExternalInterface logging 42] |
| 450 | +;; CHECK-NEXT: [LoggingExternalInterface logging 3.14159] |
| 451 | +;; CHECK-NEXT: [exception thrown: imported-js-tag externref] |
| 452 | + |
382 | 453 | ;; CHECK: [fuzz-exec] calling ref.calling.catching
|
383 | 454 | ;; CHECK-NEXT: [LoggingExternalInterface logging 42]
|
384 | 455 | ;; CHECK-NEXT: [LoggingExternalInterface logging 3.14159]
|
|
413 | 484 |
|
414 | 485 | ;; CHECK: [fuzz-exec] calling do-sleep
|
415 | 486 | ;; CHECK-NEXT: [fuzz-exec] note result: do-sleep => 42
|
| 487 | + |
| 488 | +;; CHECK: [fuzz-exec] calling return-externref-exception |
| 489 | +;; CHECK-NEXT: [fuzz-exec] note result: return-externref-exception => object |
416 | 490 | ;; CHECK-NEXT: [fuzz-exec] comparing catch-js-tag
|
417 | 491 | ;; CHECK-NEXT: [fuzz-exec] comparing do-sleep
|
418 | 492 | ;; CHECK-NEXT: [fuzz-exec] comparing export.calling
|
419 | 493 | ;; CHECK-NEXT: [fuzz-exec] comparing export.calling.catching
|
| 494 | +;; CHECK-NEXT: [fuzz-exec] comparing export.calling.rethrow |
420 | 495 | ;; CHECK-NEXT: [fuzz-exec] comparing logging
|
421 | 496 | ;; CHECK-NEXT: [fuzz-exec] comparing ref.calling
|
422 | 497 | ;; CHECK-NEXT: [fuzz-exec] comparing ref.calling.catching
|
|
426 | 501 | ;; CHECK-NEXT: [fuzz-exec] comparing ref.calling.illegal-v128
|
427 | 502 | ;; CHECK-NEXT: [fuzz-exec] comparing ref.calling.legal
|
428 | 503 | ;; CHECK-NEXT: [fuzz-exec] comparing ref.calling.legal-result
|
| 504 | +;; CHECK-NEXT: [fuzz-exec] comparing ref.calling.rethrow |
429 | 505 | ;; CHECK-NEXT: [fuzz-exec] comparing ref.calling.trap
|
| 506 | +;; CHECK-NEXT: [fuzz-exec] comparing return-externref-exception |
430 | 507 | ;; CHECK-NEXT: [fuzz-exec] comparing table.getting
|
431 | 508 | ;; CHECK-NEXT: [fuzz-exec] comparing table.setting
|
432 | 509 | ;; CHECK-NEXT: [fuzz-exec] comparing throwing
|
|
0 commit comments