Minor: IrIndexedLValue can use IrExpression's, since its subexpressions should be evaluated once.
This commit is contained in:
committed by
Dmitry Petrov
parent
888b1685ed
commit
aee83f5a77
+3
-5
@@ -90,14 +90,12 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
|
||||
|
||||
private fun generateLValue(ktLeft: KtExpression, irOperator: IrOperator?): IrLValue {
|
||||
if (ktLeft is KtArrayAccessExpression) {
|
||||
val irArrayValue = IrSingleExpressionValue(irStatementGenerator.generateExpression(ktLeft.arrayExpression!!))
|
||||
val indexExpressions = ktLeft.indexExpressions.map {
|
||||
it to IrSingleExpressionValue(irStatementGenerator.generateExpression(it))
|
||||
}
|
||||
val irArrayValue = irStatementGenerator.generateExpression(ktLeft.arrayExpression!!)
|
||||
val indexExpressions = ktLeft.indexExpressions.map { it to irStatementGenerator.generateExpression(it) }
|
||||
val indexedGetCall = get(BindingContext.INDEXED_LVALUE_GET, ktLeft)
|
||||
val indexedSetCall = get(BindingContext.INDEXED_LVALUE_SET, ktLeft)
|
||||
return IrIndexedLValue(irStatementGenerator, ktLeft, irOperator,
|
||||
irArrayValue, indexExpressions, indexedGetCall, indexedSetCall)
|
||||
irArrayValue, indexExpressions, indexedGetCall, indexedSetCall)
|
||||
}
|
||||
|
||||
val resolvedCall = getResolvedCall(ktLeft) ?: TODO("no resolved call for LHS")
|
||||
|
||||
+4
-4
@@ -32,8 +32,8 @@ class IrIndexedLValue(
|
||||
var irStatementGenerator: IrStatementGenerator,
|
||||
val ktArrayAccessExpression: KtArrayAccessExpression,
|
||||
val irOperator: IrOperator?,
|
||||
val arrayValue: IrValue,
|
||||
val indexValues: List<Pair<KtExpression, IrValue>>,
|
||||
val irArray: IrExpression,
|
||||
val indexValues: List<Pair<KtExpression, IrExpression>>,
|
||||
val indexedGetCall: ResolvedCall<*>?,
|
||||
val indexedSetCall: ResolvedCall<*>?
|
||||
) : IrLValueWithAugmentedStore {
|
||||
@@ -98,11 +98,11 @@ class IrIndexedLValue(
|
||||
}
|
||||
|
||||
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
|
||||
for ((ktIndexExpression, irIndexValue) in indexValues) {
|
||||
irBlock.addStatement(callGenerator.createTemporary(ktIndexExpression, irIndexValue.load(), "index${index++}"))
|
||||
irBlock.addStatement(callGenerator.createTemporary(ktIndexExpression, irIndexValue, "index${index++}"))
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user