|
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