github.com/wasilibs/wazerox@v0.0.0-20240124024944-4923be63ab5f/internal/integration_test/spectest/v1/testdata/call_indirect.wast (about) 1 ;; Test `call_indirect` operator 2 3 (module 4 ;; Auxiliary definitions 5 (type $proc (func)) 6 (type $out-i32 (func (result i32))) 7 (type $out-i64 (func (result i64))) 8 (type $out-f32 (func (result f32))) 9 (type $out-f64 (func (result f64))) 10 (type $over-i32 (func (param i32) (result i32))) 11 (type $over-i64 (func (param i64) (result i64))) 12 (type $over-f32 (func (param f32) (result f32))) 13 (type $over-f64 (func (param f64) (result f64))) 14 (type $f32-i32 (func (param f32 i32) (result i32))) 15 (type $i32-i64 (func (param i32 i64) (result i64))) 16 (type $f64-f32 (func (param f64 f32) (result f32))) 17 (type $i64-f64 (func (param i64 f64) (result f64))) 18 (type $over-i32-duplicate (func (param i32) (result i32))) 19 (type $over-i64-duplicate (func (param i64) (result i64))) 20 (type $over-f32-duplicate (func (param f32) (result f32))) 21 (type $over-f64-duplicate (func (param f64) (result f64))) 22 23 (func $const-i32 (type $out-i32) (i32.const 0x132)) 24 (func $const-i64 (type $out-i64) (i64.const 0x164)) 25 (func $const-f32 (type $out-f32) (f32.const 0xf32)) 26 (func $const-f64 (type $out-f64) (f64.const 0xf64)) 27 28 (func $id-i32 (type $over-i32) (local.get 0)) 29 (func $id-i64 (type $over-i64) (local.get 0)) 30 (func $id-f32 (type $over-f32) (local.get 0)) 31 (func $id-f64 (type $over-f64) (local.get 0)) 32 33 (func $i32-i64 (type $i32-i64) (local.get 1)) 34 (func $i64-f64 (type $i64-f64) (local.get 1)) 35 (func $f32-i32 (type $f32-i32) (local.get 1)) 36 (func $f64-f32 (type $f64-f32) (local.get 1)) 37 38 (func $over-i32-duplicate (type $over-i32-duplicate) (local.get 0)) 39 (func $over-i64-duplicate (type $over-i64-duplicate) (local.get 0)) 40 (func $over-f32-duplicate (type $over-f32-duplicate) (local.get 0)) 41 (func $over-f64-duplicate (type $over-f64-duplicate) (local.get 0)) 42 43 (table funcref 44 (elem 45 $const-i32 $const-i64 $const-f32 $const-f64 46 $id-i32 $id-i64 $id-f32 $id-f64 47 $f32-i32 $i32-i64 $f64-f32 $i64-f64 48 $fac-i64 $fib-i64 $even $odd 49 $runaway $mutual-runaway1 $mutual-runaway2 50 $over-i32-duplicate $over-i64-duplicate 51 $over-f32-duplicate $over-f64-duplicate 52 $fac-i32 $fac-f32 $fac-f64 53 $fib-i32 $fib-f32 $fib-f64 54 ) 55 ) 56 57 ;; Syntax 58 59 (func 60 (call_indirect (i32.const 0)) 61 (call_indirect (param i64) (i64.const 0) (i32.const 0)) 62 (call_indirect (param i64) (param) (param f64 i32 i64) 63 (i64.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (i32.const 0) 64 ) 65 (call_indirect (result) (i32.const 0)) 66 (drop (i32.eqz (call_indirect (result i32) (i32.const 0)))) 67 (drop (i32.eqz (call_indirect (result i32) (result) (i32.const 0)))) 68 (drop (i32.eqz 69 (call_indirect (param i64) (result i32) (i64.const 0) (i32.const 0)) 70 )) 71 (drop (i32.eqz 72 (call_indirect 73 (param) (param i64) (param) (param f64 i32 i64) (param) (param) 74 (result) (result i32) (result) (result) 75 (i64.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (i32.const 0) 76 ) 77 )) 78 (drop (i64.eqz 79 (call_indirect (type $over-i64) (param i64) (result i64) 80 (i64.const 0) (i32.const 0) 81 ) 82 )) 83 ) 84 85 ;; Typing 86 87 (func (export "type-i32") (result i32) 88 (call_indirect (type $out-i32) (i32.const 0)) 89 ) 90 (func (export "type-i64") (result i64) 91 (call_indirect (type $out-i64) (i32.const 1)) 92 ) 93 (func (export "type-f32") (result f32) 94 (call_indirect (type $out-f32) (i32.const 2)) 95 ) 96 (func (export "type-f64") (result f64) 97 (call_indirect (type $out-f64) (i32.const 3)) 98 ) 99 100 (func (export "type-index") (result i64) 101 (call_indirect (type $over-i64) (i64.const 100) (i32.const 5)) 102 ) 103 104 (func (export "type-first-i32") (result i32) 105 (call_indirect (type $over-i32) (i32.const 32) (i32.const 4)) 106 ) 107 (func (export "type-first-i64") (result i64) 108 (call_indirect (type $over-i64) (i64.const 64) (i32.const 5)) 109 ) 110 (func (export "type-first-f32") (result f32) 111 (call_indirect (type $over-f32) (f32.const 1.32) (i32.const 6)) 112 ) 113 (func (export "type-first-f64") (result f64) 114 (call_indirect (type $over-f64) (f64.const 1.64) (i32.const 7)) 115 ) 116 117 (func (export "type-second-i32") (result i32) 118 (call_indirect (type $f32-i32) (f32.const 32.1) (i32.const 32) (i32.const 8)) 119 ) 120 (func (export "type-second-i64") (result i64) 121 (call_indirect (type $i32-i64) (i32.const 32) (i64.const 64) (i32.const 9)) 122 ) 123 (func (export "type-second-f32") (result f32) 124 (call_indirect (type $f64-f32) (f64.const 64) (f32.const 32) (i32.const 10)) 125 ) 126 (func (export "type-second-f64") (result f64) 127 (call_indirect (type $i64-f64) (i64.const 64) (f64.const 64.1) (i32.const 11)) 128 ) 129 130 ;; Dispatch 131 132 (func (export "dispatch") (param i32 i64) (result i64) 133 (call_indirect (type $over-i64) (local.get 1) (local.get 0)) 134 ) 135 136 (func (export "dispatch-structural-i64") (param i32) (result i64) 137 (call_indirect (type $over-i64-duplicate) (i64.const 9) (local.get 0)) 138 ) 139 (func (export "dispatch-structural-i32") (param i32) (result i32) 140 (call_indirect (type $over-i32-duplicate) (i32.const 9) (local.get 0)) 141 ) 142 (func (export "dispatch-structural-f32") (param i32) (result f32) 143 (call_indirect (type $over-f32-duplicate) (f32.const 9.0) (local.get 0)) 144 ) 145 (func (export "dispatch-structural-f64") (param i32) (result f64) 146 (call_indirect (type $over-f64-duplicate) (f64.const 9.0) (local.get 0)) 147 ) 148 149 ;; Recursion 150 151 (func $fac-i64 (export "fac-i64") (type $over-i64) 152 (if (result i64) (i64.eqz (local.get 0)) 153 (then (i64.const 1)) 154 (else 155 (i64.mul 156 (local.get 0) 157 (call_indirect (type $over-i64) 158 (i64.sub (local.get 0) (i64.const 1)) 159 (i32.const 12) 160 ) 161 ) 162 ) 163 ) 164 ) 165 166 (func $fib-i64 (export "fib-i64") (type $over-i64) 167 (if (result i64) (i64.le_u (local.get 0) (i64.const 1)) 168 (then (i64.const 1)) 169 (else 170 (i64.add 171 (call_indirect (type $over-i64) 172 (i64.sub (local.get 0) (i64.const 2)) 173 (i32.const 13) 174 ) 175 (call_indirect (type $over-i64) 176 (i64.sub (local.get 0) (i64.const 1)) 177 (i32.const 13) 178 ) 179 ) 180 ) 181 ) 182 ) 183 184 (func $fac-i32 (export "fac-i32") (type $over-i32) 185 (if (result i32) (i32.eqz (local.get 0)) 186 (then (i32.const 1)) 187 (else 188 (i32.mul 189 (local.get 0) 190 (call_indirect (type $over-i32) 191 (i32.sub (local.get 0) (i32.const 1)) 192 (i32.const 23) 193 ) 194 ) 195 ) 196 ) 197 ) 198 199 (func $fac-f32 (export "fac-f32") (type $over-f32) 200 (if (result f32) (f32.eq (local.get 0) (f32.const 0.0)) 201 (then (f32.const 1.0)) 202 (else 203 (f32.mul 204 (local.get 0) 205 (call_indirect (type $over-f32) 206 (f32.sub (local.get 0) (f32.const 1.0)) 207 (i32.const 24) 208 ) 209 ) 210 ) 211 ) 212 ) 213 214 (func $fac-f64 (export "fac-f64") (type $over-f64) 215 (if (result f64) (f64.eq (local.get 0) (f64.const 0.0)) 216 (then (f64.const 1.0)) 217 (else 218 (f64.mul 219 (local.get 0) 220 (call_indirect (type $over-f64) 221 (f64.sub (local.get 0) (f64.const 1.0)) 222 (i32.const 25) 223 ) 224 ) 225 ) 226 ) 227 ) 228 229 (func $fib-i32 (export "fib-i32") (type $over-i32) 230 (if (result i32) (i32.le_u (local.get 0) (i32.const 1)) 231 (then (i32.const 1)) 232 (else 233 (i32.add 234 (call_indirect (type $over-i32) 235 (i32.sub (local.get 0) (i32.const 2)) 236 (i32.const 26) 237 ) 238 (call_indirect (type $over-i32) 239 (i32.sub (local.get 0) (i32.const 1)) 240 (i32.const 26) 241 ) 242 ) 243 ) 244 ) 245 ) 246 247 (func $fib-f32 (export "fib-f32") (type $over-f32) 248 (if (result f32) (f32.le (local.get 0) (f32.const 1.0)) 249 (then (f32.const 1.0)) 250 (else 251 (f32.add 252 (call_indirect (type $over-f32) 253 (f32.sub (local.get 0) (f32.const 2.0)) 254 (i32.const 27) 255 ) 256 (call_indirect (type $over-f32) 257 (f32.sub (local.get 0) (f32.const 1.0)) 258 (i32.const 27) 259 ) 260 ) 261 ) 262 ) 263 ) 264 265 (func $fib-f64 (export "fib-f64") (type $over-f64) 266 (if (result f64) (f64.le (local.get 0) (f64.const 1.0)) 267 (then (f64.const 1.0)) 268 (else 269 (f64.add 270 (call_indirect (type $over-f64) 271 (f64.sub (local.get 0) (f64.const 2.0)) 272 (i32.const 28) 273 ) 274 (call_indirect (type $over-f64) 275 (f64.sub (local.get 0) (f64.const 1.0)) 276 (i32.const 28) 277 ) 278 ) 279 ) 280 ) 281 ) 282 283 (func $even (export "even") (param i32) (result i32) 284 (if (result i32) (i32.eqz (local.get 0)) 285 (then (i32.const 44)) 286 (else 287 (call_indirect (type $over-i32) 288 (i32.sub (local.get 0) (i32.const 1)) 289 (i32.const 15) 290 ) 291 ) 292 ) 293 ) 294 (func $odd (export "odd") (param i32) (result i32) 295 (if (result i32) (i32.eqz (local.get 0)) 296 (then (i32.const 99)) 297 (else 298 (call_indirect (type $over-i32) 299 (i32.sub (local.get 0) (i32.const 1)) 300 (i32.const 14) 301 ) 302 ) 303 ) 304 ) 305 306 ;; Stack exhaustion 307 308 ;; Implementations are required to have every call consume some abstract 309 ;; resource towards exhausting some abstract finite limit, such that 310 ;; infinitely recursive test cases reliably trap in finite time. This is 311 ;; because otherwise applications could come to depend on it on those 312 ;; implementations and be incompatible with implementations that don't do 313 ;; it (or don't do it under the same circumstances). 314 315 (func $runaway (export "runaway") (call_indirect (type $proc) (i32.const 16))) 316 317 (func $mutual-runaway1 (export "mutual-runaway") (call_indirect (type $proc) (i32.const 18))) 318 (func $mutual-runaway2 (call_indirect (type $proc) (i32.const 17))) 319 320 ;; As parameter of control constructs and instructions 321 322 (memory 1) 323 324 (func (export "as-select-first") (result i32) 325 (select (call_indirect (type $out-i32) (i32.const 0)) (i32.const 2) (i32.const 3)) 326 ) 327 (func (export "as-select-mid") (result i32) 328 (select (i32.const 2) (call_indirect (type $out-i32) (i32.const 0)) (i32.const 3)) 329 ) 330 (func (export "as-select-last") (result i32) 331 (select (i32.const 2) (i32.const 3) (call_indirect (type $out-i32) (i32.const 0))) 332 ) 333 334 (func (export "as-if-condition") (result i32) 335 (if (result i32) (call_indirect (type $out-i32) (i32.const 0)) (then (i32.const 1)) (else (i32.const 2))) 336 ) 337 338 (func (export "as-br_if-first") (result i64) 339 (block (result i64) (br_if 0 (call_indirect (type $out-i64) (i32.const 1)) (i32.const 2))) 340 ) 341 (func (export "as-br_if-last") (result i32) 342 (block (result i32) (br_if 0 (i32.const 2) (call_indirect (type $out-i32) (i32.const 0)))) 343 ) 344 345 (func (export "as-br_table-first") (result f32) 346 (block (result f32) (call_indirect (type $out-f32) (i32.const 2)) (i32.const 2) (br_table 0 0)) 347 ) 348 (func (export "as-br_table-last") (result i32) 349 (block (result i32) (i32.const 2) (call_indirect (type $out-i32) (i32.const 0)) (br_table 0 0)) 350 ) 351 352 (func (export "as-store-first") 353 (call_indirect (type $out-i32) (i32.const 0)) (i32.const 1) (i32.store) 354 ) 355 (func (export "as-store-last") 356 (i32.const 10) (call_indirect (type $out-f64) (i32.const 3)) (f64.store) 357 ) 358 359 (func (export "as-memory.grow-value") (result i32) 360 (memory.grow (call_indirect (type $out-i32) (i32.const 0))) 361 ) 362 (func (export "as-return-value") (result i32) 363 (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) (return) 364 ) 365 (func (export "as-drop-operand") 366 (call_indirect (type $over-i64) (i64.const 1) (i32.const 5)) (drop) 367 ) 368 (func (export "as-br-value") (result f32) 369 (block (result f32) (br 0 (call_indirect (type $over-f32) (f32.const 1) (i32.const 6)))) 370 ) 371 (func (export "as-local.set-value") (result f64) 372 (local f64) (local.set 0 (call_indirect (type $over-f64) (f64.const 1) (i32.const 7))) (local.get 0) 373 ) 374 (func (export "as-local.tee-value") (result f64) 375 (local f64) (local.tee 0 (call_indirect (type $over-f64) (f64.const 1) (i32.const 7))) 376 ) 377 (global $a (mut f64) (f64.const 10.0)) 378 (func (export "as-global.set-value") (result f64) 379 (global.set $a (call_indirect (type $over-f64) (f64.const 1.0) (i32.const 7))) 380 (global.get $a) 381 ) 382 383 (func (export "as-load-operand") (result i32) 384 (i32.load (call_indirect (type $out-i32) (i32.const 0))) 385 ) 386 387 (func (export "as-unary-operand") (result f32) 388 (block (result f32) 389 (f32.sqrt 390 (call_indirect (type $over-f32) (f32.const 0x0p+0) (i32.const 6)) 391 ) 392 ) 393 ) 394 395 (func (export "as-binary-left") (result i32) 396 (block (result i32) 397 (i32.add 398 (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) 399 (i32.const 10) 400 ) 401 ) 402 ) 403 (func (export "as-binary-right") (result i32) 404 (block (result i32) 405 (i32.sub 406 (i32.const 10) 407 (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) 408 ) 409 ) 410 ) 411 412 (func (export "as-test-operand") (result i32) 413 (block (result i32) 414 (i32.eqz 415 (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) 416 ) 417 ) 418 ) 419 420 (func (export "as-compare-left") (result i32) 421 (block (result i32) 422 (i32.le_u 423 (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) 424 (i32.const 10) 425 ) 426 ) 427 ) 428 (func (export "as-compare-right") (result i32) 429 (block (result i32) 430 (i32.ne 431 (i32.const 10) 432 (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) 433 ) 434 ) 435 ) 436 437 (func (export "as-convert-operand") (result i64) 438 (block (result i64) 439 (i64.extend_i32_s 440 (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) 441 ) 442 ) 443 ) 444 445 ) 446 447 (assert_return (invoke "type-i32") (i32.const 0x132)) 448 (assert_return (invoke "type-i64") (i64.const 0x164)) 449 (assert_return (invoke "type-f32") (f32.const 0xf32)) 450 (assert_return (invoke "type-f64") (f64.const 0xf64)) 451 452 (assert_return (invoke "type-index") (i64.const 100)) 453 454 (assert_return (invoke "type-first-i32") (i32.const 32)) 455 (assert_return (invoke "type-first-i64") (i64.const 64)) 456 (assert_return (invoke "type-first-f32") (f32.const 1.32)) 457 (assert_return (invoke "type-first-f64") (f64.const 1.64)) 458 459 (assert_return (invoke "type-second-i32") (i32.const 32)) 460 (assert_return (invoke "type-second-i64") (i64.const 64)) 461 (assert_return (invoke "type-second-f32") (f32.const 32)) 462 (assert_return (invoke "type-second-f64") (f64.const 64.1)) 463 464 (assert_return (invoke "dispatch" (i32.const 5) (i64.const 2)) (i64.const 2)) 465 (assert_return (invoke "dispatch" (i32.const 5) (i64.const 5)) (i64.const 5)) 466 (assert_return (invoke "dispatch" (i32.const 12) (i64.const 5)) (i64.const 120)) 467 (assert_return (invoke "dispatch" (i32.const 13) (i64.const 5)) (i64.const 8)) 468 (assert_return (invoke "dispatch" (i32.const 20) (i64.const 2)) (i64.const 2)) 469 (assert_trap (invoke "dispatch" (i32.const 0) (i64.const 2)) "indirect call type mismatch") 470 (assert_trap (invoke "dispatch" (i32.const 15) (i64.const 2)) "indirect call type mismatch") 471 (assert_trap (invoke "dispatch" (i32.const 29) (i64.const 2)) "undefined element") 472 (assert_trap (invoke "dispatch" (i32.const -1) (i64.const 2)) "undefined element") 473 (assert_trap (invoke "dispatch" (i32.const 1213432423) (i64.const 2)) "undefined element") 474 475 (assert_return (invoke "dispatch-structural-i64" (i32.const 5)) (i64.const 9)) 476 (assert_return (invoke "dispatch-structural-i64" (i32.const 12)) (i64.const 362880)) 477 (assert_return (invoke "dispatch-structural-i64" (i32.const 13)) (i64.const 55)) 478 (assert_return (invoke "dispatch-structural-i64" (i32.const 20)) (i64.const 9)) 479 (assert_trap (invoke "dispatch-structural-i64" (i32.const 11)) "indirect call type mismatch") 480 (assert_trap (invoke "dispatch-structural-i64" (i32.const 22)) "indirect call type mismatch") 481 482 (assert_return (invoke "dispatch-structural-i32" (i32.const 4)) (i32.const 9)) 483 (assert_return (invoke "dispatch-structural-i32" (i32.const 23)) (i32.const 362880)) 484 (assert_return (invoke "dispatch-structural-i32" (i32.const 26)) (i32.const 55)) 485 (assert_return (invoke "dispatch-structural-i32" (i32.const 19)) (i32.const 9)) 486 (assert_trap (invoke "dispatch-structural-i32" (i32.const 9)) "indirect call type mismatch") 487 (assert_trap (invoke "dispatch-structural-i32" (i32.const 21)) "indirect call type mismatch") 488 489 (assert_return (invoke "dispatch-structural-f32" (i32.const 6)) (f32.const 9.0)) 490 (assert_return (invoke "dispatch-structural-f32" (i32.const 24)) (f32.const 362880.0)) 491 (assert_return (invoke "dispatch-structural-f32" (i32.const 27)) (f32.const 55.0)) 492 (assert_return (invoke "dispatch-structural-f32" (i32.const 21)) (f32.const 9.0)) 493 (assert_trap (invoke "dispatch-structural-f32" (i32.const 8)) "indirect call type mismatch") 494 (assert_trap (invoke "dispatch-structural-f32" (i32.const 19)) "indirect call type mismatch") 495 496 (assert_return (invoke "dispatch-structural-f64" (i32.const 7)) (f64.const 9.0)) 497 (assert_return (invoke "dispatch-structural-f64" (i32.const 25)) (f64.const 362880.0)) 498 (assert_return (invoke "dispatch-structural-f64" (i32.const 28)) (f64.const 55.0)) 499 (assert_return (invoke "dispatch-structural-f64" (i32.const 22)) (f64.const 9.0)) 500 (assert_trap (invoke "dispatch-structural-f64" (i32.const 10)) "indirect call type mismatch") 501 (assert_trap (invoke "dispatch-structural-f64" (i32.const 18)) "indirect call type mismatch") 502 503 (assert_return (invoke "fac-i64" (i64.const 0)) (i64.const 1)) 504 (assert_return (invoke "fac-i64" (i64.const 1)) (i64.const 1)) 505 (assert_return (invoke "fac-i64" (i64.const 5)) (i64.const 120)) 506 (assert_return (invoke "fac-i64" (i64.const 25)) (i64.const 7034535277573963776)) 507 508 (assert_return (invoke "fac-i32" (i32.const 0)) (i32.const 1)) 509 (assert_return (invoke "fac-i32" (i32.const 1)) (i32.const 1)) 510 (assert_return (invoke "fac-i32" (i32.const 5)) (i32.const 120)) 511 (assert_return (invoke "fac-i32" (i32.const 10)) (i32.const 3628800)) 512 513 (assert_return (invoke "fac-f32" (f32.const 0.0)) (f32.const 1.0)) 514 (assert_return (invoke "fac-f32" (f32.const 1.0)) (f32.const 1.0)) 515 (assert_return (invoke "fac-f32" (f32.const 5.0)) (f32.const 120.0)) 516 (assert_return (invoke "fac-f32" (f32.const 10.0)) (f32.const 3628800.0)) 517 518 (assert_return (invoke "fac-f64" (f64.const 0.0)) (f64.const 1.0)) 519 (assert_return (invoke "fac-f64" (f64.const 1.0)) (f64.const 1.0)) 520 (assert_return (invoke "fac-f64" (f64.const 5.0)) (f64.const 120.0)) 521 (assert_return (invoke "fac-f64" (f64.const 10.0)) (f64.const 3628800.0)) 522 523 (assert_return (invoke "fib-i64" (i64.const 0)) (i64.const 1)) 524 (assert_return (invoke "fib-i64" (i64.const 1)) (i64.const 1)) 525 (assert_return (invoke "fib-i64" (i64.const 2)) (i64.const 2)) 526 (assert_return (invoke "fib-i64" (i64.const 5)) (i64.const 8)) 527 (assert_return (invoke "fib-i64" (i64.const 20)) (i64.const 10946)) 528 529 (assert_return (invoke "fib-i32" (i32.const 0)) (i32.const 1)) 530 (assert_return (invoke "fib-i32" (i32.const 1)) (i32.const 1)) 531 (assert_return (invoke "fib-i32" (i32.const 2)) (i32.const 2)) 532 (assert_return (invoke "fib-i32" (i32.const 5)) (i32.const 8)) 533 (assert_return (invoke "fib-i32" (i32.const 20)) (i32.const 10946)) 534 535 (assert_return (invoke "fib-f32" (f32.const 0.0)) (f32.const 1.0)) 536 (assert_return (invoke "fib-f32" (f32.const 1.0)) (f32.const 1.0)) 537 (assert_return (invoke "fib-f32" (f32.const 2.0)) (f32.const 2.0)) 538 (assert_return (invoke "fib-f32" (f32.const 5.0)) (f32.const 8.0)) 539 (assert_return (invoke "fib-f32" (f32.const 20.0)) (f32.const 10946.0)) 540 541 (assert_return (invoke "fib-f64" (f64.const 0.0)) (f64.const 1.0)) 542 (assert_return (invoke "fib-f64" (f64.const 1.0)) (f64.const 1.0)) 543 (assert_return (invoke "fib-f64" (f64.const 2.0)) (f64.const 2.0)) 544 (assert_return (invoke "fib-f64" (f64.const 5.0)) (f64.const 8.0)) 545 (assert_return (invoke "fib-f64" (f64.const 20.0)) (f64.const 10946.0)) 546 547 (assert_return (invoke "even" (i32.const 0)) (i32.const 44)) 548 (assert_return (invoke "even" (i32.const 1)) (i32.const 99)) 549 (assert_return (invoke "even" (i32.const 100)) (i32.const 44)) 550 (assert_return (invoke "even" (i32.const 77)) (i32.const 99)) 551 (assert_return (invoke "odd" (i32.const 0)) (i32.const 99)) 552 (assert_return (invoke "odd" (i32.const 1)) (i32.const 44)) 553 (assert_return (invoke "odd" (i32.const 200)) (i32.const 99)) 554 (assert_return (invoke "odd" (i32.const 77)) (i32.const 44)) 555 556 (assert_exhaustion (invoke "runaway") "call stack exhausted") 557 (assert_exhaustion (invoke "mutual-runaway") "call stack exhausted") 558 559 (assert_return (invoke "as-select-first") (i32.const 0x132)) 560 (assert_return (invoke "as-select-mid") (i32.const 2)) 561 (assert_return (invoke "as-select-last") (i32.const 2)) 562 563 (assert_return (invoke "as-if-condition") (i32.const 1)) 564 565 (assert_return (invoke "as-br_if-first") (i64.const 0x164)) 566 (assert_return (invoke "as-br_if-last") (i32.const 2)) 567 568 (assert_return (invoke "as-br_table-first") (f32.const 0xf32)) 569 (assert_return (invoke "as-br_table-last") (i32.const 2)) 570 571 (assert_return (invoke "as-store-first")) 572 (assert_return (invoke "as-store-last")) 573 574 (assert_return (invoke "as-memory.grow-value") (i32.const 1)) 575 (assert_return (invoke "as-return-value") (i32.const 1)) 576 (assert_return (invoke "as-drop-operand")) 577 (assert_return (invoke "as-br-value") (f32.const 1)) 578 (assert_return (invoke "as-local.set-value") (f64.const 1)) 579 (assert_return (invoke "as-local.tee-value") (f64.const 1)) 580 (assert_return (invoke "as-global.set-value") (f64.const 1.0)) 581 (assert_return (invoke "as-load-operand") (i32.const 1)) 582 583 (assert_return (invoke "as-unary-operand") (f32.const 0x0p+0)) 584 (assert_return (invoke "as-binary-left") (i32.const 11)) 585 (assert_return (invoke "as-binary-right") (i32.const 9)) 586 (assert_return (invoke "as-test-operand") (i32.const 0)) 587 (assert_return (invoke "as-compare-left") (i32.const 1)) 588 (assert_return (invoke "as-compare-right") (i32.const 1)) 589 (assert_return (invoke "as-convert-operand") (i64.const 1)) 590 591 ;; Invalid syntax 592 593 (assert_malformed 594 (module quote 595 "(type $sig (func (param i32) (result i32)))" 596 "(table 0 funcref)" 597 "(func (result i32)" 598 " (call_indirect (type $sig) (result i32) (param i32)" 599 " (i32.const 0) (i32.const 0)" 600 " )" 601 ")" 602 ) 603 "unexpected token" 604 ) 605 (assert_malformed 606 (module quote 607 "(type $sig (func (param i32) (result i32)))" 608 "(table 0 funcref)" 609 "(func (result i32)" 610 " (call_indirect (param i32) (type $sig) (result i32)" 611 " (i32.const 0) (i32.const 0)" 612 " )" 613 ")" 614 ) 615 "unexpected token" 616 ) 617 (assert_malformed 618 (module quote 619 "(type $sig (func (param i32) (result i32)))" 620 "(table 0 funcref)" 621 "(func (result i32)" 622 " (call_indirect (param i32) (result i32) (type $sig)" 623 " (i32.const 0) (i32.const 0)" 624 " )" 625 ")" 626 ) 627 "unexpected token" 628 ) 629 (assert_malformed 630 (module quote 631 "(type $sig (func (param i32) (result i32)))" 632 "(table 0 funcref)" 633 "(func (result i32)" 634 " (call_indirect (result i32) (type $sig) (param i32)" 635 " (i32.const 0) (i32.const 0)" 636 " )" 637 ")" 638 ) 639 "unexpected token" 640 ) 641 (assert_malformed 642 (module quote 643 "(type $sig (func (param i32) (result i32)))" 644 "(table 0 funcref)" 645 "(func (result i32)" 646 " (call_indirect (result i32) (param i32) (type $sig)" 647 " (i32.const 0) (i32.const 0)" 648 " )" 649 ")" 650 ) 651 "unexpected token" 652 ) 653 (assert_malformed 654 (module quote 655 "(table 0 funcref)" 656 "(func (result i32)" 657 " (call_indirect (result i32) (param i32) (i32.const 0) (i32.const 0))" 658 ")" 659 ) 660 "unexpected token" 661 ) 662 663 (assert_malformed 664 (module quote 665 "(table 0 funcref)" 666 "(func (call_indirect (param $x i32) (i32.const 0) (i32.const 0)))" 667 ) 668 "unexpected token" 669 ) 670 (assert_malformed 671 (module quote 672 "(type $sig (func))" 673 "(table 0 funcref)" 674 "(func (result i32)" 675 " (call_indirect (type $sig) (result i32) (i32.const 0))" 676 ")" 677 ) 678 "inline function type" 679 ) 680 (assert_malformed 681 (module quote 682 "(type $sig (func (param i32) (result i32)))" 683 "(table 0 funcref)" 684 "(func (result i32)" 685 " (call_indirect (type $sig) (result i32) (i32.const 0))" 686 ")" 687 ) 688 "inline function type" 689 ) 690 (assert_malformed 691 (module quote 692 "(type $sig (func (param i32) (result i32)))" 693 "(table 0 funcref)" 694 "(func" 695 " (call_indirect (type $sig) (param i32) (i32.const 0) (i32.const 0))" 696 ")" 697 ) 698 "inline function type" 699 ) 700 (assert_malformed 701 (module quote 702 "(type $sig (func (param i32 i32) (result i32)))" 703 "(table 0 funcref)" 704 "(func (result i32)" 705 " (call_indirect (type $sig) (param i32) (result i32)" 706 " (i32.const 0) (i32.const 0)" 707 " )" 708 ")" 709 ) 710 "inline function type" 711 ) 712 713 ;; Invalid typing 714 715 (assert_invalid 716 (module 717 (type (func)) 718 (func $no-table (call_indirect (type 0) (i32.const 0))) 719 ) 720 "unknown table" 721 ) 722 723 (assert_invalid 724 (module 725 (type (func)) 726 (table 0 funcref) 727 (func $type-void-vs-num (i32.eqz (call_indirect (type 0) (i32.const 0)))) 728 ) 729 "type mismatch" 730 ) 731 (assert_invalid 732 (module 733 (type (func (result i64))) 734 (table 0 funcref) 735 (func $type-num-vs-num (i32.eqz (call_indirect (type 0) (i32.const 0)))) 736 ) 737 "type mismatch" 738 ) 739 740 (assert_invalid 741 (module 742 (type (func (param i32))) 743 (table 0 funcref) 744 (func $arity-0-vs-1 (call_indirect (type 0) (i32.const 0))) 745 ) 746 "type mismatch" 747 ) 748 (assert_invalid 749 (module 750 (type (func (param f64 i32))) 751 (table 0 funcref) 752 (func $arity-0-vs-2 (call_indirect (type 0) (i32.const 0))) 753 ) 754 "type mismatch" 755 ) 756 (assert_invalid 757 (module 758 (type (func)) 759 (table 0 funcref) 760 (func $arity-1-vs-0 (call_indirect (type 0) (i32.const 1) (i32.const 0))) 761 ) 762 "type mismatch" 763 ) 764 (assert_invalid 765 (module 766 (type (func)) 767 (table 0 funcref) 768 (func $arity-2-vs-0 769 (call_indirect (type 0) (f64.const 2) (i32.const 1) (i32.const 0)) 770 ) 771 ) 772 "type mismatch" 773 ) 774 775 (assert_invalid 776 (module 777 (type (func (param i32))) 778 (table 0 funcref) 779 (func $type-func-void-vs-i32 (call_indirect (type 0) (i32.const 1) (nop))) 780 ) 781 "type mismatch" 782 ) 783 (assert_invalid 784 (module 785 (type (func (param i32))) 786 (table 0 funcref) 787 (func $type-func-num-vs-i32 (call_indirect (type 0) (i32.const 0) (i64.const 1))) 788 ) 789 "type mismatch" 790 ) 791 792 (assert_invalid 793 (module 794 (type (func (param i32 i32))) 795 (table 0 funcref) 796 (func $type-first-void-vs-num 797 (call_indirect (type 0) (nop) (i32.const 1) (i32.const 0)) 798 ) 799 ) 800 "type mismatch" 801 ) 802 (assert_invalid 803 (module 804 (type (func (param i32 i32))) 805 (table 0 funcref) 806 (func $type-second-void-vs-num 807 (call_indirect (type 0) (i32.const 1) (nop) (i32.const 0)) 808 ) 809 ) 810 "type mismatch" 811 ) 812 (assert_invalid 813 (module 814 (type (func (param i32 f64))) 815 (table 0 funcref) 816 (func $type-first-num-vs-num 817 (call_indirect (type 0) (f64.const 1) (i32.const 1) (i32.const 0)) 818 ) 819 ) 820 "type mismatch" 821 ) 822 (assert_invalid 823 (module 824 (type (func (param f64 i32))) 825 (table 0 funcref) 826 (func $type-second-num-vs-num 827 (call_indirect (type 0) (i32.const 1) (f64.const 1) (i32.const 0)) 828 ) 829 ) 830 "type mismatch" 831 ) 832 833 (assert_invalid 834 (module 835 (func $f (param i32)) 836 (type $sig (func (param i32))) 837 (table funcref (elem $f)) 838 (func $type-first-empty-in-block 839 (block 840 (call_indirect (type $sig) (i32.const 0)) 841 ) 842 ) 843 ) 844 "type mismatch" 845 ) 846 (assert_invalid 847 (module 848 (func $f (param i32 i32)) 849 (type $sig (func (param i32 i32))) 850 (table funcref (elem $f)) 851 (func $type-second-empty-in-block 852 (block 853 (call_indirect (type $sig) (i32.const 0) (i32.const 0)) 854 ) 855 ) 856 ) 857 "type mismatch" 858 ) 859 (assert_invalid 860 (module 861 (func $f (param i32)) 862 (type $sig (func (param i32))) 863 (table funcref (elem $f)) 864 (func $type-first-empty-in-loop 865 (loop 866 (call_indirect (type $sig) (i32.const 0)) 867 ) 868 ) 869 ) 870 "type mismatch" 871 ) 872 (assert_invalid 873 (module 874 (func $f (param i32 i32)) 875 (type $sig (func (param i32 i32))) 876 (table funcref (elem $f)) 877 (func $type-second-empty-in-loop 878 (loop 879 (call_indirect (type $sig) (i32.const 0) (i32.const 0)) 880 ) 881 ) 882 ) 883 "type mismatch" 884 ) 885 (assert_invalid 886 (module 887 (func $f (param i32)) 888 (type $sig (func (param i32))) 889 (table funcref (elem $f)) 890 (func $type-first-empty-in-then 891 (i32.const 0) (i32.const 0) 892 (if 893 (then 894 (call_indirect (type $sig) (i32.const 0)) 895 ) 896 ) 897 ) 898 ) 899 "type mismatch" 900 ) 901 (assert_invalid 902 (module 903 (func $f (param i32 i32)) 904 (type $sig (func (param i32 i32))) 905 (table funcref (elem $f)) 906 (func $type-second-empty-in-then 907 (i32.const 0) (i32.const 0) 908 (if 909 (then 910 (call_indirect (type $sig) (i32.const 0) (i32.const 0)) 911 ) 912 ) 913 ) 914 ) 915 "type mismatch" 916 ) 917 918 919 ;; Unbound type 920 921 (assert_invalid 922 (module 923 (table 0 funcref) 924 (func $unbound-type (call_indirect (type 1) (i32.const 0))) 925 ) 926 "unknown type" 927 ) 928 (assert_invalid 929 (module 930 (table 0 funcref) 931 (func $large-type (call_indirect (type 1012321300) (i32.const 0))) 932 ) 933 "unknown type" 934 ) 935 936 937 ;; Unbound function in table 938 939 (assert_invalid 940 (module (table funcref (elem 0 0))) 941 "unknown function 0" 942 )