Fixed return value
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "ExpressionLiteral.h"
|
||||
|
||||
shared_ptr<ExpressionLiteral> ExpressionLiteral::none;
|
||||
shared_ptr<ExpressionLiteral> ExpressionLiteral::NONE;
|
||||
|
||||
ExpressionLiteral::ExpressionLiteral():
|
||||
Expression(ExpressionKind::LITERAL, ValueType::NONE) { }
|
||||
|
||||
@@ -9,7 +9,7 @@ private:
|
||||
ExpressionLiteral();
|
||||
|
||||
public:
|
||||
static shared_ptr<ExpressionLiteral> none;
|
||||
static shared_ptr<ExpressionLiteral> NONE;
|
||||
|
||||
ExpressionLiteral(shared_ptr<Token> token);
|
||||
bool getBoolValue();
|
||||
|
||||
Reference in New Issue
Block a user