Updated control flow generation

This commit is contained in:
Sasha Koshka 2024-01-27 10:03:15 +00:00
parent 6d28d52cdf
commit 706e2e0286
3 changed files with 30 additions and 30 deletions

View File

@ -108,10 +108,6 @@ func (this *generator) generateExpressionVal (expression entity.Expression) (llv
return this.generateIfElseVal(expression, false) return this.generateIfElseVal(expression, false)
case *entity.Loop: case *entity.Loop:
return this.generateLoopVal(expression, false) return this.generateLoopVal(expression, false)
case *entity.Break:
return this.generateBreakVal(expression)
case *entity.Return:
return this.generateReturnVal(expression)
case *entity.LiteralInt: case *entity.LiteralInt:
return this.generateLiteralInt(expression) return this.generateLiteralInt(expression)
@ -148,9 +144,7 @@ func (this *generator) generateExpressionLoc (expression entity.Expression) (llv
*entity.LiteralBoolean, *entity.LiteralBoolean,
*entity.LiteralNil, *entity.LiteralNil,
*entity.IfElse, *entity.IfElse,
*entity.Loop, *entity.Loop:
*entity.Break,
*entity.Return:
value, err := this.generateExpressionVal(expression) value, err := this.generateExpressionVal(expression)
if err != nil { return nil, err } if err != nil { return nil, err }
@ -189,6 +183,12 @@ func (this *generator) generateStatement (statement entity.Statement) (register
case *entity.Assignment: case *entity.Assignment:
_, err := this.generateAssignment(statement) _, err := this.generateAssignment(statement)
return nil, false, err return nil, false, err
case *entity.Break:
_, err := this.generateBreak(statement)
return nil, false, err
case *entity.Return:
_, err := this.generateReturn(statement)
return nil, false, err
case entity.Expression: case entity.Expression:
return this.generateExpression(statement) return this.generateExpression(statement)

View File

@ -715,26 +715,3 @@ func (this *generator) generateLoopVal (loop *entity.Loop, loc bool) (llvm.Value
} }
return loopEntry.value, nil return loopEntry.value, nil
} }
func (this *generator) generateBreakVal (brk *entity.Break) (llvm.Value, error) {
loopEntry := this.blockManager.topLoop()
if brk.Value != nil {
value, err := this.generateExpressionVal(brk.Value)
if err != nil { return nil, err }
loopEntry.value = value
}
loopEntry.stub = this.blockManager.Block
return nil, nil
}
func (this *generator) generateReturnVal (ret *entity.Return) (llvm.Value, error) {
if ret.Value == nil {
this.blockManager.NewRet(nil)
} else {
value, err := this.generateExpressionVal(ret.Value)
if err != nil { return nil, err }
this.blockManager.NewRet(value)
}
return nil, nil
}

View File

@ -16,3 +16,26 @@ func (this *generator) generateBlock (block *entity.Block) (llvm.Value, bool, er
return this.generateStatement(block.Steps[lastIndex]) return this.generateStatement(block.Steps[lastIndex])
} }
func (this *generator) generateBreak (brk *entity.Break) (llvm.Value, error) {
loopEntry := this.blockManager.topLoop()
if brk.Value != nil {
value, err := this.generateExpressionVal(brk.Value)
if err != nil { return nil, err }
loopEntry.value = value
}
loopEntry.stub = this.blockManager.Block
return nil, nil
}
func (this *generator) generateReturn (ret *entity.Return) (llvm.Value, error) {
if ret.Value == nil {
this.blockManager.NewRet(nil)
} else {
value, err := this.generateExpressionVal(ret.Value)
if err != nil { return nil, err }
this.blockManager.NewRet(value)
}
return nil, nil
}