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 587e17211..df34df877 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 @@ -199,13 +199,18 @@ final class KStyleLambdaGroup extends KotlinLambdaGroup { @Override SyntheticSourceCode createInstanceInitializerSourceCode( DexType groupClassType, DexMethod initializerMethod, Position callerPosition) { + int arity = factory.kotlin.functional.getArity(id.iface); + if (arity != id.mainMethodProto.parameters.size()) { + System.out.println( + "[R8 logging]: " + id.mainMethod.getCode().toString(id.mainMethod, null)); + } return new InstanceInitializerSourceCode( factory, groupClassType, group.getLambdaIdField(factory), id -> group.getCaptureField(factory, id), initializerMethod, - id.mainMethodProto.parameters.size(), + arity, callerPosition); } } diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupId.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupId.java index 996099bc2..a02a5ef8c 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupId.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupId.java @@ -38,6 +38,7 @@ abstract class KotlinLambdaGroupId implements LambdaGroupId { // (the main method if created is supposed to be inlined, since it is always // only called from the bridge, and removed. In this case the method with // signature and annotations is removed allowing more lambda to be merged.) + final DexEncodedMethod mainMethod; final DexString mainMethodName; final DexProto mainMethodProto; final DexAnnotationSet mainMethodAnnotations; @@ -58,6 +59,7 @@ abstract class KotlinLambdaGroupId implements LambdaGroupId { this.iface = iface; this.pkg = pkg; this.signature = signature; + this.mainMethod = mainMethod; this.mainMethodName = mainMethod.method.name; this.mainMethodProto = mainMethod.method.proto; this.mainMethodAnnotations = mainMethod.annotations; diff --git a/src/main/java/com/android/tools/r8/kotlin/Kotlin.java b/src/main/java/com/android/tools/r8/kotlin/Kotlin.java index 0a85f89fd..a4e474589 100644 --- a/src/main/java/com/android/tools/r8/kotlin/Kotlin.java +++ b/src/main/java/com/android/tools/r8/kotlin/Kotlin.java @@ -13,6 +13,8 @@ import com.android.tools.r8.graph.DexType; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** Class provides basic information about symbols related to Kotlin support. */ public final class Kotlin { @@ -75,6 +77,16 @@ public final class Kotlin { public boolean isFunctionInterface(DexType type) { return functions.contains(type); } + + public int getArity(DexType type) { + assert isFunctionInterface(type); + Pattern p = Pattern.compile("Function(\\d+)"); + Matcher m = p.matcher(type.toDescriptorString()); + if (m.find()) { + return Integer.parseInt(m.group(1)); + } + return -1; + } } public final class Metadata {