authorgravatar for pfg@pfg.pwpfg <pfg@pfg.pw> 2020-07-16 00:04:54-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-07-16 10:32:24+00:00
log01ab167ce3c5c0db908b11451f160359230a440f
tree56ededa01a54bae51ddf956f4a623e7b70b64f75
parente079fdeee78d37a50c4e2a9fafe77903d62dbc34

stage2: change large switch → inline for loop


1 files changed, 6 insertions(+), 39 deletions(-)

src-self-hosted/zir.zig+6-39
...@@ -760,46 +760,13 @@ const Writer = struct {...@@ -760,46 +760,13 @@ const Writer = struct {
760 stream: anytype,760 stream: anytype,
761 inst: *Inst,761 inst: *Inst,
762 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {762 ) (@TypeOf(stream).Error || error{OutOfMemory})!void {
763 // TODO I tried implementing this with an inline for loop and hit a compiler bug763 inline for (@typeInfo(Inst.Tag).Enum.fields) |enum_field| {
764 switch (inst.tag) {764 const expected_tag = @field(Inst.Tag, enum_field.name);
765 .arg => return self.writeInstToStreamGeneric(stream, .arg, inst),765 if (inst.tag == expected_tag) {
766 .block => return self.writeInstToStreamGeneric(stream, .block, inst),766 return self.writeInstToStreamGeneric(stream, expected_tag, inst);
767 .@"break" => return self.writeInstToStreamGeneric(stream, .@"break", inst),767 }
768 .breakpoint => return self.writeInstToStreamGeneric(stream, .breakpoint, inst),
769 .breakvoid => return self.writeInstToStreamGeneric(stream, .breakvoid, inst),
770 .call => return self.writeInstToStreamGeneric(stream, .call, inst),
771 .declref => return self.writeInstToStreamGeneric(stream, .declref, inst),
772 .declref_str => return self.writeInstToStreamGeneric(stream, .declref_str, inst),
773 .declval => return self.writeInstToStreamGeneric(stream, .declval, inst),
774 .declval_in_module => return self.writeInstToStreamGeneric(stream, .declval_in_module, inst),
775 .compileerror => return self.writeInstToStreamGeneric(stream, .compileerror, inst),
776 .@"const" => return self.writeInstToStreamGeneric(stream, .@"const", inst),
777 .boolnot => return self.writeInstToStreamGeneric(stream, .boolnot, inst),
778 .str => return self.writeInstToStreamGeneric(stream, .str, inst),
779 .int => return self.writeInstToStreamGeneric(stream, .int, inst),
780 .inttype => return self.writeInstToStreamGeneric(stream, .inttype, inst),
781 .ptrtoint => return self.writeInstToStreamGeneric(stream, .ptrtoint, inst),
782 .fieldptr => return self.writeInstToStreamGeneric(stream, .fieldptr, inst),
783 .deref => return self.writeInstToStreamGeneric(stream, .deref, inst),
784 .as => return self.writeInstToStreamGeneric(stream, .as, inst),
785 .@"asm" => return self.writeInstToStreamGeneric(stream, .@"asm", inst),
786 .@"unreachable" => return self.writeInstToStreamGeneric(stream, .@"unreachable", inst),
787 .@"return" => return self.writeInstToStreamGeneric(stream, .@"return", inst),
788 .returnvoid => return self.writeInstToStreamGeneric(stream, .returnvoid, inst),
789 .@"fn" => return self.writeInstToStreamGeneric(stream, .@"fn", inst),
790 .@"export" => return self.writeInstToStreamGeneric(stream, .@"export", inst),
791 .primitive => return self.writeInstToStreamGeneric(stream, .primitive, inst),
792 .fntype => return self.writeInstToStreamGeneric(stream, .fntype, inst),
793 .intcast => return self.writeInstToStreamGeneric(stream, .intcast, inst),
794 .bitcast => return self.writeInstToStreamGeneric(stream, .bitcast, inst),
795 .elemptr => return self.writeInstToStreamGeneric(stream, .elemptr, inst),
796 .add => return self.writeInstToStreamGeneric(stream, .add, inst),
797 .sub => return self.writeInstToStreamGeneric(stream, .sub, inst),
798 .cmp => return self.writeInstToStreamGeneric(stream, .cmp, inst),
799 .condbr => return self.writeInstToStreamGeneric(stream, .condbr, inst),
800 .isnull => return self.writeInstToStreamGeneric(stream, .isnull, inst),
801 .isnonnull => return self.writeInstToStreamGeneric(stream, .isnonnull, inst),
802 }768 }
769 unreachable; // all tags handled
803 }770 }
804771
805 fn writeInstToStreamGeneric(772 fn writeInstToStreamGeneric(