about summary refs log tree commit diff
path: root/src/codegen.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-15 23:50:35 +0200
committerBaitinq <[email protected]>2025-07-15 23:59:21 +0200
commit4e2ce1b6c484a60b1d9f0d6bb917ba51d6258e4e (patch)
treeaa374e4bd197e5b9d0482f363e8c30cbb3fe55b1 /src/codegen.pry
parentBoostrap: Regenerate stage 0 in script (diff)
downloadpry-lang-4e2ce1b6c484a60b1d9f0d6bb917ba51d6258e4e.tar.gz
pry-lang-4e2ce1b6c484a60b1d9f0d6bb917ba51d6258e4e.tar.bz2
pry-lang-4e2ce1b6c484a60b1d9f0d6bb917ba51d6258e4e.zip
Feature: Add support for and and or operators
Diffstat (limited to '')
-rw-r--r--src/codegen.pry21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/codegen.pry b/src/codegen.pry
index cb054ec..4c257b8 100644
--- a/src/codegen.pry
+++ b/src/codegen.pry
@@ -722,6 +722,27 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		return codegen_create_variable(c, v);
 	};
 	
+	if ((*expression).type == NODE_LOGICAL_EXPRESSION) {
+		let exp = (*(cast(*NODE_LOGICAL_EXPRESSION_DATA, (*expression).data)));
+		let lhs_value = codegen_generate_expression_value(c, exp.lhs, cast(*i8, null));
+		assert(lhs_value != cast(*Variable, null));
+		let rhs_value = codegen_generate_expression_value(c, exp.rhs, cast(*i8, null));
+		assert(rhs_value != cast(*Variable, null));
+		
+		assert(compare_types(c, (*lhs_value).node_type, (*rhs_value).node_type, false));
+
+		let result = cast(LLVMValueRef, null);
+		if exp.an {
+			result = LLVMBuildAnd((*c).builder, (*lhs_value).value, (*rhs_value).value, "");
+		};
+		if !exp.an {
+			result = LLVMBuildOr((*c).builder, (*lhs_value).value, (*rhs_value).value, "");
+		};
+		assert(result != cast(LLVMValueRef, null));
+
+		return codegen_generate_literal(c, result, name, expression, (*lhs_value).node_type);
+	};
+	
 	if ((*expression).type == NODE_EQUALITY_EXPRESSION) {
 		let exp = (*(cast(*NODE_EQUALITY_EXPRESSION_DATA, (*expression).data)));
 		let lhs_value = codegen_generate_expression_value(c, exp.lhs, cast(*i8, null));