about summary refs log tree commit diff
path: root/src/codegen.pry
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.pry')
-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));