Account for propagated fields in lambda merger
Change-Id: I99080829751fdc4188edf16b073ac295567dcd3f
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
index fbd189c..f868855 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
@@ -160,7 +160,7 @@
}
@Override
- int getInstanceInitializerSize(List<DexEncodedField> captures) {
+ int getInstanceInitializerMaxSize(List<DexEncodedField> captures) {
return captures.size() + 2;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
index b5f0eaf..b510e88 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
@@ -166,7 +166,7 @@
}
@Override
- int getInstanceInitializerSize(List<DexEncodedField> captures) {
+ int getInstanceInitializerMaxSize(List<DexEncodedField> captures) {
return captures.size() + 3;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
index f500c06..3e38f67 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
@@ -124,7 +124,7 @@
}
}
- abstract int getInstanceInitializerSize(List<DexEncodedField> captures);
+ abstract int getInstanceInitializerMaxSize(List<DexEncodedField> captures);
abstract int validateInstanceInitializerEpilogue(
com.android.tools.r8.code.Instruction[] instructions, int index) throws LambdaStructureError;
@@ -135,7 +135,7 @@
com.android.tools.r8.code.Instruction[] instructions = code.asDexCode().instructions;
int index = 0;
- if (instructions.length != getInstanceInitializerSize(captures)) {
+ if (instructions.length > getInstanceInitializerMaxSize(captures)) {
throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
}
@@ -148,15 +148,21 @@
assert index == instructions.length;
}
- private int validateInstanceInitializerParameterMapping(List<DexEncodedField> captures,
- Instruction[] instructions, int index) throws LambdaStructureError {
+ private int validateInstanceInitializerParameterMapping(
+ List<DexEncodedField> captures, Instruction[] instructions, int index)
+ throws LambdaStructureError {
+ int dead = 0;
int wideFieldsSeen = 0;
for (DexEncodedField field : captures) {
+ if (field.getOptimizationInfo().isDead()) {
+ dead++;
+ continue;
+ }
switch (field.field.type.toShorty()) {
case 'Z':
if (!(instructions[index] instanceof IputBoolean)
|| (instructions[index].getField() != field.field)
- || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+ || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
}
break;
@@ -164,7 +170,7 @@
case 'B':
if (!(instructions[index] instanceof IputByte)
|| (instructions[index].getField() != field.field)
- || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+ || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
}
break;
@@ -172,7 +178,7 @@
case 'S':
if (!(instructions[index] instanceof IputShort)
|| (instructions[index].getField() != field.field)
- || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+ || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
}
break;
@@ -180,7 +186,7 @@
case 'C':
if (!(instructions[index] instanceof IputChar)
|| (instructions[index].getField() != field.field)
- || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+ || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
}
break;
@@ -189,7 +195,7 @@
case 'F':
if (!(instructions[index] instanceof Iput)
|| (instructions[index].getField() != field.field)
- || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+ || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
}
break;
@@ -198,7 +204,7 @@
case 'D':
if (!(instructions[index] instanceof IputWide)
|| (instructions[index].getField() != field.field)
- || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+ || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
}
wideFieldsSeen++;
@@ -207,7 +213,7 @@
case 'L':
if (!(instructions[index] instanceof IputObject)
|| (instructions[index].getField() != field.field)
- || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+ || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
}
break;