| 659 | // ── GC struct/array instructions ────────────────────────────────────────────── |
| 660 | |
| 661 | WasmInstr ParseContext::parse_gcinstr(const std::string& name) { |
| 662 | // Struct |
| 663 | if (name == "struct.new") return Instr::Struct_new(parse_typeidx()); |
| 664 | if (name == "struct.new_default") return Instr::Struct_new_default(parse_typeidx()); |
| 665 | if (name == "struct.get") { index_t t = parse_typeidx(); return Instr::Struct_get(t, parse_u32()); } |
| 666 | if (name == "struct.get_s") { index_t t = parse_typeidx(); return Instr::Struct_get_s(t, parse_u32()); } |
| 667 | if (name == "struct.get_u") { index_t t = parse_typeidx(); return Instr::Struct_get_u(t, parse_u32()); } |
| 668 | if (name == "struct.set") { index_t t = parse_typeidx(); return Instr::Struct_set(t, parse_u32()); } |
| 669 | // Array |
| 670 | if (name == "array.new") return Instr::Array_new(parse_typeidx()); |
| 671 | if (name == "array.new_default") return Instr::Array_new_default(parse_typeidx()); |
| 672 | if (name == "array.new_fixed") { index_t t = parse_typeidx(); return Instr::Array_new_fixed(t, parse_u32()); } |
| 673 | if (name == "array.new_data") { index_t t = parse_typeidx(); return Instr::Array_new_data(t, parse_dataidx()); } |
| 674 | if (name == "array.new_elem") { index_t t = parse_typeidx(); return Instr::Array_new_elem(t, parse_elemidx()); } |
| 675 | if (name == "array.get") return Instr::Array_get(parse_typeidx()); |
| 676 | if (name == "array.get_s") return Instr::Array_get_s(parse_typeidx()); |
| 677 | if (name == "array.get_u") return Instr::Array_get_u(parse_typeidx()); |
| 678 | if (name == "array.set") return Instr::Array_set(parse_typeidx()); |
| 679 | if (name == "array.len") return Instr::Array_len(); |
| 680 | if (name == "array.fill") return Instr::Array_fill(parse_typeidx()); |
| 681 | if (name == "array.copy") { index_t d = parse_typeidx(); return Instr::Array_copy(d, parse_typeidx()); } |
| 682 | if (name == "array.init_data") { index_t t = parse_typeidx(); return Instr::Array_init_data(t, parse_dataidx()); } |
| 683 | if (name == "array.init_elem") { index_t t = parse_typeidx(); return Instr::Array_init_elem(t, parse_elemidx()); } |
| 684 | throw Exception::Parse("unknown GC instruction '" + name + "'", tok_.location()); |
| 685 | } |
nothing calls this directly
no test coverage detected