translator: fix returning variable in if expressions, add IntArray.plus(IntArray)
This commit is contained in:
@@ -41,10 +41,7 @@ class IntArray(var size: Int) {
|
|||||||
public fun IntArray.copyOf(newSize: Int): IntArray {
|
public fun IntArray.copyOf(newSize: Int): IntArray {
|
||||||
val newInstance = IntArray(newSize)
|
val newInstance = IntArray(newSize)
|
||||||
var index = 0
|
var index = 0
|
||||||
var end = this.size
|
val end = if (newSize > this.size) this.size else newSize
|
||||||
if (newSize < this.size) {
|
|
||||||
end = newSize
|
|
||||||
}
|
|
||||||
while (index < end) {
|
while (index < end) {
|
||||||
val value = this.get(index)
|
val value = this.get(index)
|
||||||
newInstance.set(index, value)
|
newInstance.set(index, value)
|
||||||
@@ -77,3 +74,19 @@ public operator fun IntArray.plus(element: Int): IntArray {
|
|||||||
result[index] = element
|
result[index] = element
|
||||||
return result
|
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.addCondition(conditionResult, thenLabel, elseLabel)
|
||||||
codeBuilder.markWithLabel(thenLabel)
|
codeBuilder.markWithLabel(thenLabel)
|
||||||
val thenResultExpression = evaluateExpression(thenExpression, scopeDepth + 1)
|
val thenResultExpression = evaluateExpression(thenExpression, scopeDepth + 1) ?: return null
|
||||||
codeBuilder.storeVariable(resultVariable, thenResultExpression ?: return null)
|
val thenResultNativeExpression = codeBuilder.receiveNativeValue(thenResultExpression)
|
||||||
|
codeBuilder.storeVariable(resultVariable, thenResultNativeExpression)
|
||||||
codeBuilder.addUnconditionalJump(endLabel)
|
codeBuilder.addUnconditionalJump(endLabel)
|
||||||
codeBuilder.markWithLabel(elseLabel)
|
codeBuilder.markWithLabel(elseLabel)
|
||||||
|
|
||||||
val elseResultExpression = evaluateExpression(elseExpression, scopeDepth + 1)
|
val elseResultExpression = evaluateExpression(elseExpression, scopeDepth + 1) ?: return null
|
||||||
codeBuilder.storeVariable(resultVariable, elseResultExpression ?: return null)
|
val elseResultNativeExpression = codeBuilder.receiveNativeValue(elseResultExpression)
|
||||||
|
codeBuilder.storeVariable(resultVariable, elseResultNativeExpression)
|
||||||
codeBuilder.addUnconditionalJump(endLabel)
|
codeBuilder.addUnconditionalJump(endLabel)
|
||||||
codeBuilder.markWithLabel(endLabel)
|
codeBuilder.markWithLabel(endLabel)
|
||||||
return resultVariable
|
return resultVariable
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
if_expression_1_Int(56) == 2323
|
if_expression_1_Int(56) == 2323
|
||||||
if_expression_1_Int(-58) == 678934
|
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{
|
fun if_expression_1(x: Int): Int{
|
||||||
return if (x > 55) 2323 else 678934
|
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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user