forked from luna/jorts
vm: add greater and less
This commit is contained in:
parent
15c58a2216
commit
71dba5c77d
3 changed files with 21 additions and 1 deletions
|
@ -183,6 +183,12 @@ pub const Chunk = struct {
|
||||||
return try simpleInstruction(stdout, "OP_FALSE", index);
|
return try simpleInstruction(stdout, "OP_FALSE", index);
|
||||||
} else if (instruction == OpCode.Not) {
|
} else if (instruction == OpCode.Not) {
|
||||||
return try simpleInstruction(stdout, "OP_NOT", index);
|
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 {
|
} else {
|
||||||
try stdout.print("Unknown opcode: {}\n", instruction);
|
try stdout.print("Unknown opcode: {}\n", instruction);
|
||||||
return index + 1;
|
return index + 1;
|
||||||
|
|
|
@ -221,7 +221,6 @@ pub const Compiler = struct {
|
||||||
|
|
||||||
/// Emits bytecode for a number being loaded into the code.
|
/// Emits bytecode for a number being loaded into the code.
|
||||||
fn number(self: *Compiler) !void {
|
fn number(self: *Compiler) !void {
|
||||||
std.debug.warn("parsing number: '{}'\n", self.parser.previous.lexeme);
|
|
||||||
var value: f64 = try std.fmt.parseFloat(
|
var value: f64 = try std.fmt.parseFloat(
|
||||||
f64,
|
f64,
|
||||||
self.parser.previous.lexeme,
|
self.parser.previous.lexeme,
|
||||||
|
|
15
src/vm.zig
15
src/vm.zig
|
@ -143,6 +143,18 @@ pub const VM = struct {
|
||||||
try self.push(values.NumberVal(a / b));
|
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 {
|
fn runtimeError(self: *VM, comptime fmt: []const u8, args: ...) void {
|
||||||
std.debug.warn(fmt, args);
|
std.debug.warn(fmt, args);
|
||||||
std.debug.warn("\n[line {}] in script\n", self.chk.lines[self.ip]);
|
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)));
|
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.Add => try self.doAdd(),
|
||||||
chunk.OpCode.Subtract => try self.doSub(),
|
chunk.OpCode.Subtract => try self.doSub(),
|
||||||
chunk.OpCode.Multiply => try self.doMul(),
|
chunk.OpCode.Multiply => try self.doMul(),
|
||||||
|
|
Loading…
Reference in a new issue