about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/bootstrap/tokenizer.src45
-rw-r--r--src/codegen.zig19
2 files changed, 31 insertions, 33 deletions
diff --git a/src/bootstrap/tokenizer.src b/src/bootstrap/tokenizer.src
index 5ece444..f097a9d 100644
--- a/src/bootstrap/tokenizer.src
+++ b/src/bootstrap/tokenizer.src
@@ -117,12 +117,10 @@ let tokenizer_consume_until_condition = (condition: (i8) => bool) => *i8 {
 	return null;
 };
 
-let isnt_digit = (c: i8) => bool {
-	return !isdigit(c);
-};
-
 let tokenizer_accept_int_type = () => *i64 {
-	let string = tokenizer_consume_until_condition(isnt_digit);
+	let string = tokenizer_consume_until_condition((c: i8) => bool {
+		return !isdigit(c);
+	});
 	if string == null {
 		return null;
 	};
@@ -131,14 +129,9 @@ let tokenizer_accept_int_type = () => *i64 {
 	};
 	let x = malloc(8);
 	*x = atoi(string);
-	printf("Int: %d\n", *x);
 	return x;
 };
 
-let is_backtick = (c: i8) => bool {
-	return c == '\'';
-};
-
 let tokenizer_accept_char_type = () => *i8 {
 	let prev_offset = offset;
 	if !tokenizer_accept_string("'") {
@@ -146,7 +139,9 @@ let tokenizer_accept_char_type = () => *i8 {
 		return null;
 	};
 
-	let string = tokenizer_consume_until_condition(is_backtick);
+	let string = tokenizer_consume_until_condition((c: i8) => bool {
+		return c == '\'';
+	});
 
 	/*let string_len = strlen(string);
 	let i = 0;
@@ -184,10 +179,6 @@ let tokenizer_accept_char_type = () => *i8 {
 	return string;
 };
 
-let is_quote = (c: i8) => bool {
-	return c == '"';
-};
-
 let tokenizer_accept_string_type = () => *i8 {
 	let prev_offset = offset;
 	if !tokenizer_accept_string("\"") {
@@ -195,7 +186,9 @@ let tokenizer_accept_string_type = () => *i8 {
 		return null;
 	};
 
-	let string = tokenizer_consume_until_condition(is_quote);
+	let string = tokenizer_consume_until_condition((c: i8) => bool {
+		return c == '"';
+	});
 
 	if !tokenizer_accept_string("\"") {
 		offset = prev_offset;
@@ -215,16 +208,6 @@ let tokenizer_skip_comments = () => void {
 	return;
 };
 
-let ident_cond = (c: i8) => bool {
-	if isalphanum(c) {
-		return false;
-	};
-	if c == '_' {
-		return false;
-	};
-	return true;
-};
-
 let tokenizer_next = () => *i8 {
 	tokenizer_skip_whitespace();
 	tokenizer_skip_comments();
@@ -338,7 +321,15 @@ let tokenizer_next = () => *i8 {
 		return t;
 	};
 
-	let string = tokenizer_consume_until_condition(ident_cond);
+	let string = tokenizer_consume_until_condition((c: i8) => bool {
+		if isalphanum(c) {
+			return false;
+		};
+		if c == '_' {
+			return false;
+		};
+		return true;
+	});
 	if strlen(string) == 0 {
 		return null;
 	};
diff --git a/src/codegen.zig b/src/codegen.zig
index d126cde..e835fed 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -23,6 +23,7 @@ pub const CodeGen = struct {
     arena: std.mem.Allocator,
 
     while_loop_exit: ?llvm.LLVMBasicBlockRef,
+    current_function: ?llvm.LLVMValueRef,
 
     pub fn init(arena: std.mem.Allocator) !*CodeGen {
         // Initialize LLVM
@@ -44,6 +45,7 @@ pub const CodeGen = struct {
             .arena = arena,
 
             .while_loop_exit = null,
+            .current_function = null,
         };
 
         return self;
@@ -269,12 +271,12 @@ pub const CodeGen = struct {
 
         const current_block = llvm.LLVMGetInsertBlock(self.builder);
 
-        const then_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "then_block");
+        const then_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "then_block");
         _ = llvm.LLVMPositionBuilderAtEnd(self.builder, then_block);
         for (if_statement.statements) |stmt| {
             try self.generate_statement(stmt);
         }
-        const merge_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "merge_block");
+        const merge_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "merge_block");
         const last_instr = llvm.LLVMGetLastInstruction(llvm.LLVMGetInsertBlock(self.builder));
         if (last_instr == null or llvm.LLVMIsATerminatorInst(last_instr) == null) {
             _ = llvm.LLVMBuildBr(self.builder, merge_block);
@@ -291,13 +293,13 @@ pub const CodeGen = struct {
 
         const while_statement = statement.WHILE_STATEMENT;
 
-        const while_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "while_block");
+        const while_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "while_block");
         _ = llvm.LLVMBuildBr(self.builder, while_block);
         _ = llvm.LLVMPositionBuilderAtEnd(self.builder, while_block);
         const condition_value = try self.generate_expression_value(while_statement.condition, null);
 
-        const inner_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "inner_block");
-        const outer_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "outer_block");
+        const inner_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "inner_block");
+        const outer_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "outer_block");
         _ = llvm.LLVMBuildCondBr(self.builder, condition_value.value, inner_block, outer_block);
 
         self.while_loop_exit = outer_block;
@@ -351,7 +353,12 @@ pub const CodeGen = struct {
                 llvm.LLVMPositionBuilderAtEnd(self.builder, function_entry);
 
                 try self.environment.create_scope();
-                defer self.environment.drop_scope();
+                const last_function = self.current_function;
+                self.current_function = function;
+                defer {
+                    self.current_function = last_function;
+                    self.environment.drop_scope();
+                }
 
                 const node_type = try self.create_node(.{
                     .TYPE = .{