test_switch_dispatch_loop.zig (1009B) - Raw
1 const std = @import("std"); 2 const expectEqual = std.testing.expectEqual; 3 4 const Instruction = enum { 5 add, 6 mul, 7 end, 8 }; 9 10 fn evaluate(initial_stack: []const i32, code: []const Instruction) !i32 { 11 var buffer: [8]i32 = undefined; 12 var stack = std.ArrayListUnmanaged(i32).initBuffer(&buffer); 13 try stack.appendSliceBounded(initial_stack); 14 var ip: usize = 0; 15 16 return vm: switch (code[ip]) { 17 // Because all code after `continue` is unreachable, this branch does 18 // not provide a result. 19 .add => { 20 try stack.appendBounded(stack.pop().? + stack.pop().?); 21 22 ip += 1; 23 continue :vm code[ip]; 24 }, 25 .mul => { 26 try stack.appendBounded(stack.pop().? * stack.pop().?); 27 28 ip += 1; 29 continue :vm code[ip]; 30 }, 31 .end => stack.pop().?, 32 }; 33 } 34 35 test "evaluate" { 36 const result = try evaluate(&.{ 7, 2, -3 }, &.{ .mul, .add, .end }); 37 try expectEqual(1, result); 38 } 39 40 // test