From 71dba5c77d82298975fae5d4ee6ae330ef3da799 Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 2 Jun 2019 00:23:50 -0300 Subject: [PATCH] vm: add greater and less --- src/chunk.zig | 6 ++++++ src/compiler.zig | 1 - src/vm.zig | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/chunk.zig b/src/chunk.zig index 31985eb..50aca63 100644 --- a/src/chunk.zig +++ b/src/chunk.zig @@ -183,6 +183,12 @@ pub const Chunk = struct { return try simpleInstruction(stdout, "OP_FALSE", index); } else if (instruction == OpCode.Not) { return try simpleInstruction(stdout, "OP_NOT", index); + } else if (instruction == OpCode.Equal) { + return try simpleInstruction(stdout, "OP_EQUAL", index); + } else if (instruction == OpCode.Greater) { + return try simpleInstruction(stdout, "OP_GREATER", index); + } else if (instruction == OpCode.Less) { + return try simpleInstruction(stdout, "OP_LESS", index); } else { try stdout.print("Unknown opcode: {}\n", instruction); return index + 1; diff --git a/src/compiler.zig b/src/compiler.zig index 17b8a0b..459adda 100644 --- a/src/compiler.zig +++ b/src/compiler.zig @@ -221,7 +221,6 @@ pub const Compiler = struct { /// Emits bytecode for a number being loaded into the code. fn number(self: *Compiler) !void { - std.debug.warn("parsing number: '{}'\n", self.parser.previous.lexeme); var value: f64 = try std.fmt.parseFloat( f64, self.parser.previous.lexeme, diff --git a/src/vm.zig b/src/vm.zig index d712897..1fbf0ac 100644 --- a/src/vm.zig +++ b/src/vm.zig @@ -143,6 +143,18 @@ pub const VM = struct { try self.push(values.NumberVal(a / b)); } + fn doGreater(self: *VM) !void { + var b = try self.popNum(); + var a = try self.popNum(); + try self.push(values.BoolVal(a > b)); + } + + fn doLess(self: *VM) !void { + var b = try self.popNum(); + var a = try self.popNum(); + try self.push(values.BoolVal(a < b)); + } + fn runtimeError(self: *VM, comptime fmt: []const u8, args: ...) void { std.debug.warn(fmt, args); std.debug.warn("\n[line {}] in script\n", self.chk.lines[self.ip]); @@ -186,6 +198,9 @@ pub const VM = struct { try self.push(values.BoolVal(valuesEqual(a, b))); }, + chunk.OpCode.Greater => try self.doGreater(), + chunk.OpCode.Less => try self.doLess(), + chunk.OpCode.Add => try self.doAdd(), chunk.OpCode.Subtract => try self.doSub(), chunk.OpCode.Multiply => try self.doMul(),