about summary refs log tree commit diff
path: root/src/bootstrap/codegen.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-09 01:01:42 +0200
committerBaitinq <[email protected]>2025-07-09 01:01:42 +0200
commit7b2f901f166b95d42186e2532c25d8b140907c93 (patch)
tree5fc76a0b66347dc4deb3f63e2a9fc2f7166ec402 /src/bootstrap/codegen.pry
parentBootstrap: Codegen: Support char types (diff)
downloadpry-lang-7b2f901f166b95d42186e2532c25d8b140907c93.tar.gz
pry-lang-7b2f901f166b95d42186e2532c25d8b140907c93.tar.bz2
pry-lang-7b2f901f166b95d42186e2532c25d8b140907c93.zip
Bootstrap: Support if statement
Diffstat (limited to 'src/bootstrap/codegen.pry')
-rw-r--r--src/bootstrap/codegen.pry40
1 files changed, 39 insertions, 1 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index 55be4fa..8b95451 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -470,7 +470,6 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		/* TODO: Move to defer */
 		(*c).current_function = last_function;
 		environment_drop_scope((*c).environment);
-		
 
 		return codegen_create_variable(c, v);
 	};
@@ -634,6 +633,40 @@ let codegen_generate_function_call_statement = (c: *codegen, statement: *Node) =
 	return codegen_create_variable(c, v);
 };
 
+let codegen_generate_if_statement = (c: *codegen, statement: *NODE_IF_STATEMENT_DATA) => *void {
+	let condition_value = codegen_generate_expression_value(c, (*statement).condition, cast(*i8, null));
+	assert(condition_value != cast(*Variable, null));
+
+	let current_block = LLVMGetInsertBlock((*c).builder);
+
+	let then_block = LLVMAppendBasicBlock((*c).current_function, "then_block");
+	LLVMPositionBuilderAtEnd((*c).builder, then_block);
+
+	let i = 0;
+	while i < (*statement).statements_len {
+		let stmt = (*((*statement).statements + cast(**Node, i)));
+		let res = codegen_generate_statement(c, stmt);
+		assert(res == 0);
+		i = i + 1;
+	};
+
+	let merge_block = LLVMAppendBasicBlock((*c).current_function, "merge_block");
+	let last_instr = LLVMGetLastInstruction(LLVMGetInsertBlock((*c).builder));
+	if last_instr == cast(LLVMValueRef, null) {
+		LLVMBuildBr((*c).builder, merge_block);
+	};
+	if last_instr != cast(LLVMValueRef, null) {
+		if LLVMIsATerminatorInst(last_instr) == cast(LLVMValueRef, null) {
+			LLVMBuildBr((*c).builder, merge_block);
+		};
+	};
+	LLVMPositionBuilderAtEnd((*c).builder, current_block);
+        LLVMBuildCondBr((*c).builder, (*condition_value).value, then_block, merge_block);
+        LLVMPositionBuilderAtEnd((*c).builder, merge_block);
+
+	return null;
+};
+
 let codegen_generate_statement = (c: *codegen, statement: *Node) => i64 {
 	let stmt = *statement;
 
@@ -649,6 +682,11 @@ let codegen_generate_statement = (c: *codegen, statement: *Node) => i64 {
 		codegen_generate_function_call_statement(c, statement);
 		return 0;
 	};
+	
+	if stmt.type == NODE_IF_STATEMENT {
+		codegen_generate_if_statement(c, cast(*NODE_IF_STATEMENT_DATA, stmt.data));
+		return 0;
+	};
 
 	printf("ASSERT 3 %d\n", stmt.type);
 	assert(false);