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 {
|
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")
|
||||||
|
|||||||
+4
-4
@@ -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++}"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user