| 539 | } |
| 540 | |
| 541 | fn do_case(keys: &[u128], typ: Type) { |
| 542 | let mut func = Function::new(); |
| 543 | let mut builder_ctx = FunctionBuilderContext::new(); |
| 544 | let mut builder = FunctionBuilder::new(&mut func, &mut builder_ctx); |
| 545 | |
| 546 | let root_block = builder.create_block(); |
| 547 | let default_block = builder.create_block(); |
| 548 | let mut switch = Switch::new(); |
| 549 | |
| 550 | let case_blocks = keys |
| 551 | .iter() |
| 552 | .map(|key| { |
| 553 | let block = builder.create_block(); |
| 554 | switch.set_entry(*key, block); |
| 555 | block |
| 556 | }) |
| 557 | .collect::<Vec<_>>(); |
| 558 | |
| 559 | builder.seal_block(root_block); |
| 560 | builder.switch_to_block(root_block); |
| 561 | |
| 562 | let val = builder.ins().iconst(typ, 1); |
| 563 | switch.emit(&mut builder, val, default_block); |
| 564 | |
| 565 | for &block in case_blocks.iter().chain(std::iter::once(&default_block)) { |
| 566 | builder.seal_block(block); |
| 567 | builder.switch_to_block(block); |
| 568 | builder.ins().return_(&[]); |
| 569 | } |
| 570 | |
| 571 | builder.finalize(); // Will panic if some blocks are not sealed |
| 572 | } |
| 573 | } |
| 574 | |
| 575 | #[test] |