translator: fix returning variable in if expressions, add IntArray.plus(IntArray)

This commit is contained in:
Alexey Stepanov
2016-08-10 19:18:25 +03:00
parent 6c509d0220
commit fb2e23913e
4 changed files with 31 additions and 8 deletions
+17 -4
View File
@@ -41,10 +41,7 @@ class IntArray(var size: Int) {
public fun IntArray.copyOf(newSize: Int): IntArray {
val newInstance = IntArray(newSize)
var index = 0
var end = this.size
if (newSize < this.size) {
end = newSize
}
val end = if (newSize > this.size) this.size else newSize
while (index < end) {
val value = this.get(index)
newInstance.set(index, value)
@@ -76,4 +73,20 @@ public operator fun IntArray.plus(element: Int): IntArray {
val result = this.copyOf(index + 1)
result[index] = element
return result
}
public operator fun IntArray.plus(elements: IntArray): IntArray {
val thisSize = size
val arraySize = elements.size
val resultSize = thisSize + arraySize
val newInstance = this.copyOf(resultSize)
var index = thisSize
while (index < resultSize) {
val value = elements.get(index - thisSize)
newInstance.set(index, value)
index = index + 1
}
return newInstance
}
@@ -867,13 +867,15 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
codeBuilder.addCondition(conditionResult, thenLabel, elseLabel)
codeBuilder.markWithLabel(thenLabel)
val thenResultExpression = evaluateExpression(thenExpression, scopeDepth + 1)
codeBuilder.storeVariable(resultVariable, thenResultExpression ?: return null)
val thenResultExpression = evaluateExpression(thenExpression, scopeDepth + 1) ?: return null
val thenResultNativeExpression = codeBuilder.receiveNativeValue(thenResultExpression)
codeBuilder.storeVariable(resultVariable, thenResultNativeExpression)
codeBuilder.addUnconditionalJump(endLabel)
codeBuilder.markWithLabel(elseLabel)
val elseResultExpression = evaluateExpression(elseExpression, scopeDepth + 1)
codeBuilder.storeVariable(resultVariable, elseResultExpression ?: return null)
val elseResultExpression = evaluateExpression(elseExpression, scopeDepth + 1) ?: return null
val elseResultNativeExpression = codeBuilder.receiveNativeValue(elseResultExpression)
codeBuilder.storeVariable(resultVariable, elseResultNativeExpression)
codeBuilder.addUnconditionalJump(endLabel)
codeBuilder.markWithLabel(endLabel)
return resultVariable
@@ -1,2 +1,4 @@
if_expression_1_Int(56) == 2323
if_expression_1_Int(-58) == 678934
if_expression_1_variable_Int(100) == 5
if_expression_1_variable_Int(-100) == 7
@@ -1,3 +1,9 @@
fun if_expression_1(x: Int): Int{
return if (x > 55) 2323 else 678934
}
fun if_expression_1_variable(x: Int): Int{
val first = 5
val second = 7
return if (x > 55) first else second
}