diff options
| author | Baitinq <[email protected]> | 2025-07-15 23:50:35 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-07-15 23:59:21 +0200 |
| commit | 4e2ce1b6c484a60b1d9f0d6bb917ba51d6258e4e (patch) | |
| tree | aa374e4bd197e5b9d0482f363e8c30cbb3fe55b1 /src/codegen.pry | |
| parent | Boostrap: Regenerate stage 0 in script (diff) | |
| download | pry-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.pry | 21 |
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)); |