Minor: IrIndexedLValue can use IrExpression's, since its subexpressions should be evaluated once.

This commit is contained in:
Dmitry Petrov
2016-08-17 11:48:45 +03:00
committed by Dmitry Petrov
parent 888b1685ed
commit aee83f5a77
2 changed files with 7 additions and 9 deletions
@@ -90,14 +90,12 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
private fun generateLValue(ktLeft: KtExpression, irOperator: IrOperator?): IrLValue { private fun generateLValue(ktLeft: KtExpression, irOperator: IrOperator?): IrLValue {
if (ktLeft is KtArrayAccessExpression) { if (ktLeft is KtArrayAccessExpression) {
val irArrayValue = IrSingleExpressionValue(irStatementGenerator.generateExpression(ktLeft.arrayExpression!!)) val irArrayValue = irStatementGenerator.generateExpression(ktLeft.arrayExpression!!)
val indexExpressions = ktLeft.indexExpressions.map { val indexExpressions = ktLeft.indexExpressions.map { it to irStatementGenerator.generateExpression(it) }
it to IrSingleExpressionValue(irStatementGenerator.generateExpression(it))
}
val indexedGetCall = get(BindingContext.INDEXED_LVALUE_GET, ktLeft) val indexedGetCall = get(BindingContext.INDEXED_LVALUE_GET, ktLeft)
val indexedSetCall = get(BindingContext.INDEXED_LVALUE_SET, ktLeft) val indexedSetCall = get(BindingContext.INDEXED_LVALUE_SET, ktLeft)
return IrIndexedLValue(irStatementGenerator, ktLeft, irOperator, return IrIndexedLValue(irStatementGenerator, ktLeft, irOperator,
irArrayValue, indexExpressions, indexedGetCall, indexedSetCall) irArrayValue, indexExpressions, indexedGetCall, indexedSetCall)
} }
val resolvedCall = getResolvedCall(ktLeft) ?: TODO("no resolved call for LHS") val resolvedCall = getResolvedCall(ktLeft) ?: TODO("no resolved call for LHS")
@@ -32,8 +32,8 @@ class IrIndexedLValue(
var irStatementGenerator: IrStatementGenerator, var irStatementGenerator: IrStatementGenerator,
val ktArrayAccessExpression: KtArrayAccessExpression, val ktArrayAccessExpression: KtArrayAccessExpression,
val irOperator: IrOperator?, val irOperator: IrOperator?,
val arrayValue: IrValue, val irArray: IrExpression,
val indexValues: List<Pair<KtExpression, IrValue>>, val indexValues: List<Pair<KtExpression, IrExpression>>,
val indexedGetCall: ResolvedCall<*>?, val indexedGetCall: ResolvedCall<*>?,
val indexedSetCall: ResolvedCall<*>? val indexedSetCall: ResolvedCall<*>?
) : IrLValueWithAugmentedStore { ) : IrLValueWithAugmentedStore {
@@ -98,11 +98,11 @@ class IrIndexedLValue(
} }
private fun defineContextVariables(irBlock: IrBlockExpression, callGenerator: IrCallGenerator) { private fun defineContextVariables(irBlock: IrBlockExpression, callGenerator: IrCallGenerator) {
irBlock.addStatement(callGenerator.createTemporary(ktArrayAccessExpression.arrayExpression!!, arrayValue.load(), "array")) irBlock.addStatement(callGenerator.createTemporary(ktArrayAccessExpression.arrayExpression!!, irArray, "array"))
var index = 0 var index = 0
for ((ktIndexExpression, irIndexValue) in indexValues) { for ((ktIndexExpression, irIndexValue) in indexValues) {
irBlock.addStatement(callGenerator.createTemporary(ktIndexExpression, irIndexValue.load(), "index${index++}")) irBlock.addStatement(callGenerator.createTemporary(ktIndexExpression, irIndexValue, "index${index++}"))
} }
} }
} }