From 01ab167ce3c5c0db908b11451f160359230a440f Mon Sep 17 00:00:00 2001 From: pfg Date: Thu, 16 Jul 2020 00:04:54 -0700 Subject: [PATCH] =?UTF-8?q?stage2:=20change=20large=20switch=20=E2=86=92?= =?UTF-8?q?=20inline=20for=20loop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-self-hosted/zir.zig | 45 ++++++----------------------------------- 1 file changed, 6 insertions(+), 39 deletions(-) diff --git a/src-self-hosted/zir.zig b/src-self-hosted/zir.zig index 2f696d1787..5e8c966b94 100644 --- a/src-self-hosted/zir.zig +++ b/src-self-hosted/zir.zig @@ -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(