mirror of
https://github.com/ziglang/zig.git
synced 2026-01-04 12:33:19 +00:00
sema: extract runtime switch AIR generation to function
This commit is contained in:
parent
ae19f699ab
commit
6bf319ebbb
94
src/Sema.zig
94
src/Sema.zig
@ -11355,7 +11355,6 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r
|
||||
|
||||
const mod = sema.mod;
|
||||
const gpa = sema.gpa;
|
||||
const ip = &mod.intern_pool;
|
||||
const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
|
||||
const src = inst_data.src();
|
||||
const src_node_offset = inst_data.src_node;
|
||||
@ -11944,6 +11943,71 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r
|
||||
unreachable;
|
||||
}
|
||||
|
||||
_ = try sema.analyzeSwitchRuntimeBlock(
|
||||
spa,
|
||||
&child_block,
|
||||
src,
|
||||
operand,
|
||||
operand_ty,
|
||||
operand_src,
|
||||
case_vals,
|
||||
special,
|
||||
scalar_cases_len,
|
||||
multi_cases_len,
|
||||
union_originally,
|
||||
maybe_union_ty,
|
||||
err_set,
|
||||
src_node_offset,
|
||||
special_prong_src,
|
||||
seen_enum_fields,
|
||||
seen_errors,
|
||||
range_set,
|
||||
true_count,
|
||||
false_count,
|
||||
cond_dbg_node_index,
|
||||
);
|
||||
|
||||
return sema.analyzeBlockBody(block, src, &child_block, merges);
|
||||
}
|
||||
|
||||
const SpecialProng = struct {
|
||||
body: []const Zir.Inst.Index,
|
||||
end: usize,
|
||||
capture: Zir.Inst.SwitchBlock.ProngInfo.Capture,
|
||||
is_inline: bool,
|
||||
has_tag_capture: bool,
|
||||
};
|
||||
|
||||
fn analyzeSwitchRuntimeBlock(
|
||||
sema: *Sema,
|
||||
spa: SwitchProngAnalysis,
|
||||
child_block: *Block,
|
||||
src: LazySrcLoc,
|
||||
operand: Air.Inst.Ref,
|
||||
operand_ty: Type,
|
||||
operand_src: LazySrcLoc,
|
||||
case_vals: std.ArrayListUnmanaged(Air.Inst.Ref),
|
||||
special: SpecialProng,
|
||||
scalar_cases_len: usize,
|
||||
multi_cases_len: usize,
|
||||
union_originally: bool,
|
||||
maybe_union_ty: Type,
|
||||
err_set: bool,
|
||||
src_node_offset: i32,
|
||||
special_prong_src: LazySrcLoc,
|
||||
seen_enum_fields: []?Module.SwitchProngSrc,
|
||||
seen_errors: SwitchErrorSet,
|
||||
range_set: RangeSet,
|
||||
true_count: u8,
|
||||
false_count: u8,
|
||||
cond_dbg_node_index: Zir.Inst.Index,
|
||||
) CompileError!Air.Inst.Ref {
|
||||
const mod = sema.mod;
|
||||
const gpa = sema.gpa;
|
||||
const ip = &mod.intern_pool;
|
||||
|
||||
const block = child_block.parent.?;
|
||||
|
||||
const estimated_cases_extra = (scalar_cases_len + multi_cases_len) *
|
||||
@typeInfo(Air.SwitchBr.Case).Struct.fields.len + 2;
|
||||
var cases_extra = try std.ArrayListUnmanaged(u32).initCapacity(gpa, estimated_cases_extra);
|
||||
@ -12534,27 +12598,23 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r
|
||||
try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.SwitchBr).Struct.fields.len +
|
||||
cases_extra.items.len + final_else_body.len);
|
||||
|
||||
_ = try child_block.addInst(.{ .tag = .switch_br, .data = .{ .pl_op = .{
|
||||
.operand = operand,
|
||||
.payload = sema.addExtraAssumeCapacity(Air.SwitchBr{
|
||||
.cases_len = @intCast(cases_len),
|
||||
.else_body_len = @intCast(final_else_body.len),
|
||||
}),
|
||||
} } });
|
||||
const payload_index = sema.addExtraAssumeCapacity(Air.SwitchBr{
|
||||
.cases_len = @intCast(cases_len),
|
||||
.else_body_len = @intCast(final_else_body.len),
|
||||
});
|
||||
|
||||
sema.air_extra.appendSliceAssumeCapacity(@ptrCast(cases_extra.items));
|
||||
sema.air_extra.appendSliceAssumeCapacity(@ptrCast(final_else_body));
|
||||
|
||||
return sema.analyzeBlockBody(block, src, &child_block, merges);
|
||||
return try child_block.addInst(.{
|
||||
.tag = .switch_br,
|
||||
.data = .{ .pl_op = .{
|
||||
.operand = operand,
|
||||
.payload = payload_index,
|
||||
} },
|
||||
});
|
||||
}
|
||||
|
||||
const SpecialProng = struct {
|
||||
body: []const Zir.Inst.Index,
|
||||
end: usize,
|
||||
capture: Zir.Inst.SwitchBlock.ProngInfo.Capture,
|
||||
is_inline: bool,
|
||||
has_tag_capture: bool,
|
||||
};
|
||||
|
||||
fn resolveSwitchComptime(
|
||||
sema: *Sema,
|
||||
spa: SwitchProngAnalysis,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user