stage2: change large switch → inline for loop

This commit is contained in:
pfg
2020-07-16 00:04:54 -07:00
committed by Andrew Kelley
parent e079fdeee7
commit 01ab167ce3

View File

@@ -760,46 +760,13 @@ const Writer = struct {
stream: anytype,
inst: *Inst,
) (@TypeOf(stream).Error || error{OutOfMemory})!void {
// TODO I tried implementing this with an inline for loop and hit a compiler bug
switch (inst.tag) {
.arg => return self.writeInstToStreamGeneric(stream, .arg, inst),
.block => return self.writeInstToStreamGeneric(stream, .block, inst),
.@"break" => return self.writeInstToStreamGeneric(stream, .@"break", inst),
.breakpoint => return self.writeInstToStreamGeneric(stream, .breakpoint, inst),
.breakvoid => return self.writeInstToStreamGeneric(stream, .breakvoid, inst),
.call => return self.writeInstToStreamGeneric(stream, .call, inst),
.declref => return self.writeInstToStreamGeneric(stream, .declref, inst),
.declref_str => return self.writeInstToStreamGeneric(stream, .declref_str, inst),
.declval => return self.writeInstToStreamGeneric(stream, .declval, inst),
.declval_in_module => return self.writeInstToStreamGeneric(stream, .declval_in_module, inst),
.compileerror => return self.writeInstToStreamGeneric(stream, .compileerror, inst),
.@"const" => return self.writeInstToStreamGeneric(stream, .@"const", inst),
.boolnot => return self.writeInstToStreamGeneric(stream, .boolnot, inst),
.str => return self.writeInstToStreamGeneric(stream, .str, inst),
.int => return self.writeInstToStreamGeneric(stream, .int, inst),
.inttype => return self.writeInstToStreamGeneric(stream, .inttype, inst),
.ptrtoint => return self.writeInstToStreamGeneric(stream, .ptrtoint, inst),
.fieldptr => return self.writeInstToStreamGeneric(stream, .fieldptr, inst),
.deref => return self.writeInstToStreamGeneric(stream, .deref, inst),
.as => return self.writeInstToStreamGeneric(stream, .as, inst),
.@"asm" => return self.writeInstToStreamGeneric(stream, .@"asm", inst),
.@"unreachable" => return self.writeInstToStreamGeneric(stream, .@"unreachable", inst),
.@"return" => return self.writeInstToStreamGeneric(stream, .@"return", inst),
.returnvoid => return self.writeInstToStreamGeneric(stream, .returnvoid, inst),
.@"fn" => return self.writeInstToStreamGeneric(stream, .@"fn", inst),
.@"export" => return self.writeInstToStreamGeneric(stream, .@"export", inst),
.primitive => return self.writeInstToStreamGeneric(stream, .primitive, inst),
.fntype => return self.writeInstToStreamGeneric(stream, .fntype, inst),
.intcast => return self.writeInstToStreamGeneric(stream, .intcast, inst),
.bitcast => return self.writeInstToStreamGeneric(stream, .bitcast, inst),
.elemptr => return self.writeInstToStreamGeneric(stream, .elemptr, inst),
.add => return self.writeInstToStreamGeneric(stream, .add, inst),
.sub => return self.writeInstToStreamGeneric(stream, .sub, inst),
.cmp => return self.writeInstToStreamGeneric(stream, .cmp, inst),
.condbr => return self.writeInstToStreamGeneric(stream, .condbr, inst),
.isnull => return self.writeInstToStreamGeneric(stream, .isnull, inst),
.isnonnull => return self.writeInstToStreamGeneric(stream, .isnonnull, inst),
inline for (@typeInfo(Inst.Tag).Enum.fields) |enum_field| {
const expected_tag = @field(Inst.Tag, enum_field.name);
if (inst.tag == expected_tag) {
return self.writeInstToStreamGeneric(stream, expected_tag, inst);
}
}
unreachable; // all tags handled
}
fn writeInstToStreamGeneric(