summaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 6dde45d..5636dbd 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -228,3 +228,79 @@ test "Codegen exit" {
const actual = try gen.generate();
try expect(std.mem.eql(u8, actual, expected));
}
+
+test "Codegen assign" {
+ const tok = @import("tokenize.zig");
+ const expect = std.testing.expect;
+ const main = @import("main.zig");
+
+ const src =
+ \\fn main() -> i32 {
+ \\ const testval = 6;
+ \\ var testvar = testval;
+ \\ testvar = 5;
+ \\ return testvar;
+ \\}
+ ;
+ const expected =
+ \\; ModuleID = '_calico_start'
+ \\source_filename = "_calico_start"
+ \\
+ \\define i32 @main() {
+ \\entry:
+ \\ %testvar = alloca i32, align 4
+ \\ %testval = alloca i32, align 4
+ \\ store i32 6, ptr %testval, align 4
+ \\ %0 = load i32, ptr %testval, align 4
+ \\ store i32 %0, ptr %testvar, align 4
+ \\ store i32 5, ptr %testvar, align 4
+ \\ %1 = load i32, ptr %testvar, align 4
+ \\ ret i32 %1
+ \\}
+ \\
+ ;
+ var tokenizer = tok.Tokenizer.init(std.testing.allocator, src);
+ defer tokenizer.deinit();
+ const toks = try tokenizer.tokenize();
+ var symbTable: *symb.SymbolTable = try main.initSymbolTable(std.testing.allocator);
+ defer symbTable.deinit();
+ var parser = parse.Parser.init(std.testing.allocator, toks, symbTable);
+ defer parser.deinit();
+ const parseTree = try parser.parse();
+ var pop = symb.Populator.init(std.testing.allocator);
+ var treeNode = parseTree.asNode();
+ try pop.populateSymtable(&treeNode);
+ var gen = Generator.init(std.testing.allocator, parseTree);
+ defer gen.deinit();
+ const actual = try gen.generate();
+ try expect(std.mem.eql(u8, actual, expected));
+}
+
+test "Codegen assign constant" {
+ const tok = @import("tokenize.zig");
+ const main = @import("main.zig");
+
+ const src =
+ \\fn main() -> i32 {
+ \\ const testval = 6;
+ \\ const testvar = testval;
+ \\ testvar = 5;
+ \\ return testvar;
+ \\}
+ ;
+ var tokenizer = tok.Tokenizer.init(std.testing.allocator, src);
+ defer tokenizer.deinit();
+ const toks = try tokenizer.tokenize();
+ var symbTable: *symb.SymbolTable = try main.initSymbolTable(std.testing.allocator);
+ defer symbTable.deinit();
+ var parser = parse.Parser.init(std.testing.allocator, toks, symbTable);
+ defer parser.deinit();
+ const parseTree = try parser.parse();
+ var pop = symb.Populator.init(std.testing.allocator);
+ var treeNode = parseTree.asNode();
+ try pop.populateSymtable(&treeNode);
+ var gen = Generator.init(std.testing.allocator, parseTree);
+ defer gen.deinit();
+ const actual = gen.generate();
+ try std.testing.expectError(CodegenError.Immutable, actual);
+}