Fixed return value

This commit is contained in:
Rafał Grodziński
2025-06-23 19:37:19 +09:00
parent 2847a5ea5b
commit 981854835e
6 changed files with 32 additions and 16 deletions

View File

@@ -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<ExpressionIfElse> 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<ExpressionIfElse> 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();

View File

@@ -2,16 +2,26 @@
#include "Parser/Expression/ExpressionLiteral.h"
#include "Parser/Statement/StatementExpression.h"
#include "Parser/Statement/StatementBlock.h"
ExpressionBlock::ExpressionBlock(vector<shared_ptr<Statement>> 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<StatementExpression>(statements.back());
this->statements.pop_back();
valueType = resultExpression->getExpression()->getValueType();
resultStatementExpression = dynamic_pointer_cast<StatementExpression>(statements.back());
valueType = resultStatementExpression->getExpression()->getValueType();
statements.pop_back();
} else {
resultExpression = make_shared<StatementExpression>(ExpressionLiteral::none);
resultStatementExpression = make_shared<StatementExpression>(ExpressionLiteral::NONE);
}
statementBlock = make_shared<StatementBlock>(statements);
}
shared_ptr<StatementBlock> ExpressionBlock::getStatementBlock() {
return statementBlock;
}
shared_ptr<StatementExpression> ExpressionBlock::getResultStatementExpression() {
return resultStatementExpression;
}
string ExpressionBlock::toString(int indent) {

View File

@@ -1,14 +1,17 @@
#include "Parser/Expression/Expression.h"
class Statement;
class StatementBlock;
class StatementExpression;
class ExpressionBlock: public Expression {
private:
vector<shared_ptr<Statement>> statements;
shared_ptr<StatementExpression> resultExpression;
shared_ptr<StatementBlock> statementBlock;
shared_ptr<StatementExpression> resultStatementExpression;
public:
ExpressionBlock(vector<shared_ptr<Statement>> statements);
shared_ptr<StatementBlock> getStatementBlock();
shared_ptr<StatementExpression> getResultStatementExpression();
string toString(int indent) override;
};

View File

@@ -3,7 +3,11 @@
#include "Parser/Expression/ExpressionBlock.h"
ExpressionIfElse::ExpressionIfElse(shared_ptr<Expression> condition, shared_ptr<ExpressionBlock> thenBlock, shared_ptr<ExpressionBlock> 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<Expression> ExpressionIfElse::getCondition() {
return condition;

View File

@@ -1,6 +1,6 @@
#include "ExpressionLiteral.h"
shared_ptr<ExpressionLiteral> ExpressionLiteral::none;
shared_ptr<ExpressionLiteral> ExpressionLiteral::NONE;
ExpressionLiteral::ExpressionLiteral():
Expression(ExpressionKind::LITERAL, ValueType::NONE) { }

View File

@@ -9,7 +9,7 @@ private:
ExpressionLiteral();
public:
static shared_ptr<ExpressionLiteral> none;
static shared_ptr<ExpressionLiteral> NONE;
ExpressionLiteral(shared_ptr<Token> token);
bool getBoolValue();