From 93bc38ec73ed1c37aadd64d6311f8ca720dba848 Mon Sep 17 00:00:00 2001 From: bgk- Date: Mon, 19 Aug 2024 20:23:19 -0700 Subject: [PATCH] Bug fixes --- src/backend/compiler.zig | 2 ++ src/runtime/state.zig | 2 +- src/runtime/vm.zig | 12 ++++++++---- test/vm.test.zig | 37 +++++++++++++++++++++++++++++++++---- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/backend/compiler.zig b/src/backend/compiler.zig index 53b5c28..0a62504 100644 --- a/src/backend/compiler.zig +++ b/src/backend/compiler.zig @@ -687,7 +687,9 @@ pub const Compiler = struct { self.jump_tree.current.*.dest_ip = self.instructionPos(); defer self.jump_tree.pop(); + const locals_count = self.scope.count; try self.enterScope(.local); + self.scope.count = locals_count; errdefer self.exitScope() catch {}; const path = try std.mem.join(self.allocator, ".", self.visit_tree.list.items); diff --git a/src/runtime/state.zig b/src/runtime/state.zig index 4cafd51..aa64eb9 100644 --- a/src/runtime/state.zig +++ b/src/runtime/state.zig @@ -237,7 +237,7 @@ pub const State = struct { if (entry.object.get("number")) |v| return .{ .number = @floatCast(v.float) }; if (entry.object.get("string")) |v| return try vm.gc.create(vm, .{ .string = try vm.allocator.dupe(u8, v.string) }); if (entry.object.get("nil") != null) return Nil; - if (entry.object.get("boolean")) |v| return if (v.bool) True else False; + if (entry.object.get("bool")) |v| return if (v.bool) True else False; if (entry.object.get("visit")) |v| return .{ .visit = @intCast(v.integer) }; if (entry.object.get("ref")) |v| { if (refs.get(UUID.fromString(v.string))) |ref| return ref; diff --git a/src/runtime/vm.zig b/src/runtime/vm.zig index 01d61ab..0ab396b 100644 --- a/src/runtime/vm.zig +++ b/src/runtime/vm.zig @@ -371,8 +371,10 @@ pub const Vm = struct { }, .pop => _ = try self.pop(), .add => { - const right = try self.pop(); - const left = try self.pop(); + var right = try self.pop(); + var left = try self.pop(); + if (right == .visit) right = .{ .number = @floatFromInt(right.visit) }; + if (left == .visit) left = .{ .number = @floatFromInt(left.visit) }; if (@intFromEnum(right) != @intFromEnum(left)) { return self.fail("Cannot add types {s} and {s}", .{ left.typeName(), right.typeName() }); } @@ -1044,8 +1046,10 @@ pub const Vm = struct { } fn binaryNumberOp(self: *Vm, op: OpCode) !void { - const right = try self.pop(); - const left = try self.pop(); + var right = try self.pop(); + var left = try self.pop(); + if (right == .visit) right = .{ .number = @floatFromInt(right.visit) }; + if (left == .visit) left = .{ .number = @floatFromInt(left.visit) }; if (right != .number or left != .number) return self.fail("Cannot perform binary operation on types of '{s}' and '{s}'", .{ left.typeName(), right.typeName() }); const right_num = right.number; diff --git a/test/vm.test.zig b/test/vm.test.zig index 1ec130e..e6ee910 100644 --- a/test/vm.test.zig +++ b/test/vm.test.zig @@ -602,7 +602,7 @@ test "Closures" { } } -test "Loops" { +test "While and For Loops" { const test_cases = .{ .{ .input = \\ var x = 0 @@ -639,6 +639,21 @@ test "Loops" { \\ x , .value = 10 }, .{ .input = + \\ var x = 0 + \\ while true { + \\ var y = 1 + \\ while true { + \\ y += x + 1 + \\ if y < 10 continue + \\ break; + \\ } + \\ x = x + y + \\ if x < 100 continue + \\ break + \\ } + \\ x + , .value = 190 }, + .{ .input = \\ const list = List{1,2,3,4,5} \\ var sum = 0 \\ for list |item| { @@ -684,6 +699,7 @@ test "Loops" { var vm = try initTestVm(case.input, mod, false); defer vm.deinit(); defer vm.bytecode.free(testing.allocator); + errdefer std.log.warn("Error Case: {s}", .{case.input}); vm.interpret() catch |err| { vm.err.print(std.io.getStdErr().writer()); return err; @@ -943,11 +959,15 @@ test "Boughs" { }, .{ .input = \\ === START { + \\ var str = "string" \\ :speaker: "Text goes here" \\ === OUTER { + \\ var num = 50 \\ :speaker: "Outer text here doesn't happen" \\ === INNER { - \\ :speaker: "Inner and final text here" + \\ num += 5 + \\ str += " gnirts" + \\ :speaker: "Inner and final text here {str} {num}" \\ } \\ } \\ :speaker: "More goes here" @@ -961,10 +981,13 @@ test "Boughs" { var mod = try Module.initEmpty(allocator); defer mod.deinit(); std.debug.print("\n======\n", .{}); - var vm = try initTestVm(case.input, mod, false); + var vm = try initTestVm(case.input, mod, true); defer vm.deinit(); defer vm.bytecode.free(testing.allocator); - try vm.interpret(); + vm.interpret() catch |err| { + vm.err.print(std.io.getStdErr().writer()); + return err; + }; } } @@ -1150,6 +1173,12 @@ test "Visits" { \\ print("START.NAMED: {START.NAMED}") \\ print("START.NAMED.ONE: {START.NAMED.ONE}") \\ print("START.NAMED.TWO: {START.NAMED.TWO}") + \\ // test binary operation + \\ print("ADD: {START + 1}") + \\ print("SUBTRACT: {START - 1}") + \\ print("PRODUCT: {START * 2}") + \\ print("DIVISION: {START / 3}") + \\ print("MODULUS: {START % 4}") \\ } , },