From 981854835e8c32c909d491d6f87122f007eb5150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Mon, 23 Jun 2025 19:37:19 +0900 Subject: [PATCH] Fixed return value --- src/Compiler/ModuleBuilder.cpp | 11 +++++------ src/Parser/Expression/ExpressionBlock.cpp | 20 +++++++++++++++----- src/Parser/Expression/ExpressionBlock.h | 7 +++++-- src/Parser/Expression/ExpressionIfElse.cpp | 6 +++++- src/Parser/Expression/ExpressionLiteral.cpp | 2 +- src/Parser/Expression/ExpressionLiteral.h | 2 +- 6 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index 35f883c..a5de296 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -6,6 +6,7 @@ #include "Parser/Expression/ExpressionCall.h" #include "Parser/Expression/ExpressionIfElse.h" #include "Parser/Expression/ExpressionBinary.h" +#include "Parser/Expression/ExpressionBlock.h" #include "Parser/Statement/StatementFunction.h" #include "Parser/Statement/StatementVariable.h" @@ -278,9 +279,8 @@ llvm::Value *ModuleBuilder::valueForIfElse(shared_ptr expressi // Then builder->SetInsertPoint(thenBlock); - //llvm::Value *thenValue = valueForExpression(expression->getThenBlock()->getStatementExpression()->getExpression()); - llvm::Value *thenValue = llvm::UndefValue::get(typeVoid); - //buildStatement(expression->getThenBlock()); + llvm::Value *thenValue = valueForExpression(expression->getThenBlock()->getResultStatementExpression()->getExpression()); + buildStatement(expression->getThenBlock()->getStatementBlock()); builder->CreateBr(mergeBlock); thenBlock = builder->GetInsertBlock(); @@ -290,9 +290,8 @@ llvm::Value *ModuleBuilder::valueForIfElse(shared_ptr expressi llvm::Value *elseValue = nullptr; if (expression->getElseBlock() != nullptr) { valuesCount++; - //elseValue = valueForExpression(expression->getElseBlock()->getStatementExpression()->getExpression()); - llvm::Value *elseValue = llvm::UndefValue::get(typeVoid); - //buildStatement(expression->getElseBlock()); + elseValue = valueForExpression(expression->getElseBlock()->getResultStatementExpression()->getExpression()); + buildStatement(expression->getElseBlock()->getStatementBlock()); } builder->CreateBr(mergeBlock); elseBlock = builder->GetInsertBlock(); diff --git a/src/Parser/Expression/ExpressionBlock.cpp b/src/Parser/Expression/ExpressionBlock.cpp index 2c634e9..e3e40c3 100644 --- a/src/Parser/Expression/ExpressionBlock.cpp +++ b/src/Parser/Expression/ExpressionBlock.cpp @@ -2,16 +2,26 @@ #include "Parser/Expression/ExpressionLiteral.h" #include "Parser/Statement/StatementExpression.h" +#include "Parser/Statement/StatementBlock.h" ExpressionBlock::ExpressionBlock(vector> statements): -Expression(ExpressionKind::BLOCK, ValueType::NONE), statements(statements) { +Expression(ExpressionKind::BLOCK, ValueType::NONE) { if (!statements.empty() && statements.back()->getKind() == StatementKind::EXPRESSION) { - resultExpression = dynamic_pointer_cast(statements.back()); - this->statements.pop_back(); - valueType = resultExpression->getExpression()->getValueType(); + resultStatementExpression = dynamic_pointer_cast(statements.back()); + valueType = resultStatementExpression->getExpression()->getValueType(); + statements.pop_back(); } else { - resultExpression = make_shared(ExpressionLiteral::none); + resultStatementExpression = make_shared(ExpressionLiteral::NONE); } + statementBlock = make_shared(statements); +} + +shared_ptr ExpressionBlock::getStatementBlock() { + return statementBlock; +} + +shared_ptr ExpressionBlock::getResultStatementExpression() { + return resultStatementExpression; } string ExpressionBlock::toString(int indent) { diff --git a/src/Parser/Expression/ExpressionBlock.h b/src/Parser/Expression/ExpressionBlock.h index 8bbdfb9..05f5663 100644 --- a/src/Parser/Expression/ExpressionBlock.h +++ b/src/Parser/Expression/ExpressionBlock.h @@ -1,14 +1,17 @@ #include "Parser/Expression/Expression.h" class Statement; +class StatementBlock; class StatementExpression; class ExpressionBlock: public Expression { private: - vector> statements; - shared_ptr resultExpression; + shared_ptr statementBlock; + shared_ptr resultStatementExpression; public: ExpressionBlock(vector> statements); + shared_ptr getStatementBlock(); + shared_ptr getResultStatementExpression(); string toString(int indent) override; }; \ No newline at end of file diff --git a/src/Parser/Expression/ExpressionIfElse.cpp b/src/Parser/Expression/ExpressionIfElse.cpp index 91057be..2d4d374 100644 --- a/src/Parser/Expression/ExpressionIfElse.cpp +++ b/src/Parser/Expression/ExpressionIfElse.cpp @@ -3,7 +3,11 @@ #include "Parser/Expression/ExpressionBlock.h" ExpressionIfElse::ExpressionIfElse(shared_ptr condition, shared_ptr thenBlock, shared_ptr elseBlock): -Expression(ExpressionKind::IF_ELSE, ValueType::NONE), condition(condition), thenBlock(thenBlock), elseBlock(elseBlock) { } +Expression(ExpressionKind::IF_ELSE, ValueType::NONE), condition(condition), thenBlock(thenBlock), elseBlock(elseBlock) { + // Figure out resulting type + if (elseBlock == nullptr || thenBlock->getValueType() == elseBlock->getValueType()) + valueType = thenBlock->getValueType(); +} shared_ptr ExpressionIfElse::getCondition() { return condition; diff --git a/src/Parser/Expression/ExpressionLiteral.cpp b/src/Parser/Expression/ExpressionLiteral.cpp index 815d6c9..0db92f7 100644 --- a/src/Parser/Expression/ExpressionLiteral.cpp +++ b/src/Parser/Expression/ExpressionLiteral.cpp @@ -1,6 +1,6 @@ #include "ExpressionLiteral.h" -shared_ptr ExpressionLiteral::none; +shared_ptr ExpressionLiteral::NONE; ExpressionLiteral::ExpressionLiteral(): Expression(ExpressionKind::LITERAL, ValueType::NONE) { } diff --git a/src/Parser/Expression/ExpressionLiteral.h b/src/Parser/Expression/ExpressionLiteral.h index 09731f7..0fc1578 100644 --- a/src/Parser/Expression/ExpressionLiteral.h +++ b/src/Parser/Expression/ExpressionLiteral.h @@ -9,7 +9,7 @@ private: ExpressionLiteral(); public: - static shared_ptr none; + static shared_ptr NONE; ExpressionLiteral(shared_ptr token); bool getBoolValue();