forked from cosmonaut/wraith-lang
add else blocks
parent
7ca87d6b13
commit
708d4de0ae
|
@ -642,9 +642,41 @@ static void CompileIfStatement(LLVMBuilderRef builder, LLVMValueRef function, No
|
|||
for (i = 0; i < ifStatement->children[1]->childCount; i += 1)
|
||||
{
|
||||
CompileStatement(builder, function, ifStatement->children[1]->children[i]);
|
||||
LLVMBuildBr(builder, afterCond);
|
||||
}
|
||||
|
||||
LLVMBuildBr(builder, afterCond);
|
||||
LLVMPositionBuilderAtEnd(builder, afterCond);
|
||||
}
|
||||
|
||||
static void CompileIfElseStatement(LLVMBuilderRef builder, LLVMValueRef function, Node *ifElseStatement)
|
||||
{
|
||||
uint32_t i;
|
||||
LLVMValueRef conditional = CompileExpression(builder, ifElseStatement->children[0]->children[0]);
|
||||
|
||||
LLVMBasicBlockRef ifBlock = LLVMAppendBasicBlock(function, "ifBlock");
|
||||
LLVMBasicBlockRef elseBlock = LLVMAppendBasicBlock(function, "elseBlock");
|
||||
LLVMBasicBlockRef afterCond = LLVMAppendBasicBlock(function, "afterCond");
|
||||
|
||||
LLVMBuildCondBr(builder, conditional, ifBlock, elseBlock);
|
||||
|
||||
LLVMPositionBuilderAtEnd(builder, ifBlock);
|
||||
|
||||
for (i = 0; i < ifElseStatement->children[0]->children[1]->childCount; i += 1)
|
||||
{
|
||||
CompileStatement(builder, function, ifElseStatement->children[0]->children[1]->children[i]);
|
||||
}
|
||||
|
||||
LLVMBuildBr(builder, afterCond);
|
||||
|
||||
LLVMPositionBuilderAtEnd(builder, elseBlock);
|
||||
|
||||
for (i = 0; i < ifElseStatement->children[1]->childCount; i += 1)
|
||||
{
|
||||
CompileStatement(builder, function, ifElseStatement->children[1]->children[i]);
|
||||
}
|
||||
|
||||
LLVMBuildBr(builder, afterCond);
|
||||
|
||||
LLVMPositionBuilderAtEnd(builder, afterCond);
|
||||
}
|
||||
|
||||
|
@ -668,6 +700,10 @@ static uint8_t CompileStatement(LLVMBuilderRef builder, LLVMValueRef function, N
|
|||
CompileIfStatement(builder, function, statement);
|
||||
return 0;
|
||||
|
||||
case IfElseStatement:
|
||||
CompileIfElseStatement(builder, function, statement);
|
||||
return 0;
|
||||
|
||||
case Return:
|
||||
CompileReturn(builder, statement);
|
||||
return 1;
|
||||
|
|
Loading…
Reference in New Issue