Updated control flow generation
This commit is contained in:
parent
6d28d52cdf
commit
706e2e0286
@ -108,10 +108,6 @@ func (this *generator) generateExpressionVal (expression entity.Expression) (llv
|
||||
return this.generateIfElseVal(expression, false)
|
||||
case *entity.Loop:
|
||||
return this.generateLoopVal(expression, false)
|
||||
case *entity.Break:
|
||||
return this.generateBreakVal(expression)
|
||||
case *entity.Return:
|
||||
return this.generateReturnVal(expression)
|
||||
|
||||
case *entity.LiteralInt:
|
||||
return this.generateLiteralInt(expression)
|
||||
@ -148,9 +144,7 @@ func (this *generator) generateExpressionLoc (expression entity.Expression) (llv
|
||||
*entity.LiteralBoolean,
|
||||
*entity.LiteralNil,
|
||||
*entity.IfElse,
|
||||
*entity.Loop,
|
||||
*entity.Break,
|
||||
*entity.Return:
|
||||
*entity.Loop:
|
||||
|
||||
value, err := this.generateExpressionVal(expression)
|
||||
if err != nil { return nil, err }
|
||||
@ -189,6 +183,12 @@ func (this *generator) generateStatement (statement entity.Statement) (register
|
||||
case *entity.Assignment:
|
||||
_, err := this.generateAssignment(statement)
|
||||
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:
|
||||
return this.generateExpression(statement)
|
||||
|
@ -715,26 +715,3 @@ func (this *generator) generateLoopVal (loop *entity.Loop, loc bool) (llvm.Value
|
||||
}
|
||||
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
|
||||
}
|
||||
|
@ -16,3 +16,26 @@ func (this *generator) generateBlock (block *entity.Block) (llvm.Value, bool, er
|
||||
|
||||
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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user