zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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