Use that no lambda classes are synthesized during wave processing in R8 Bug: 142233246 Change-Id: Ifb605376adab2c5018c0d32b5ee6011ec6828a36
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java index 9cc26c4..dfb1787 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -156,8 +156,12 @@ continue; } - // We have a descriptor, get or create lambda class. - LambdaClass lambdaClass = getOrCreateLambdaClass(descriptor, currentType); + // We have a descriptor, get the lambda class. In D8, we synthesize the lambda classes + // during IR processing, and therefore we may need to create it now. + LambdaClass lambdaClass = + appView.enableWholeProgramOptimizations() + ? getKnownLambdaClass(descriptor, currentType) + : getOrCreateLambdaClass(descriptor, currentType); assert lambdaClass != null; // We rely on patch performing its work in a way which @@ -325,6 +329,11 @@ return lambdaClass; } + private LambdaClass getKnownLambdaClass(LambdaDescriptor descriptor, DexType accessedFrom) { + DexType lambdaClassType = LambdaClass.createLambdaClassType(this, accessedFrom, descriptor); + return getKnown(knownLambdaClasses, lambdaClassType); + } + private void addRewritingPrefix(DexType type, DexType rewritten, DexType lambdaClassType) { String javaName = lambdaClassType.toString(); String typeString = type.toString();