Remove all usages of SynthesizedCode in D8
Bug: 188074112
Change-Id: I8a82fffb56bfee47bc0461495d177f9d1a064557
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 66b7e4e..b824a77 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -48,7 +48,6 @@
import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
import com.android.tools.r8.ir.analysis.inlining.SimpleInliningConstraint;
import com.android.tools.r8.ir.code.IRCode;
-import com.android.tools.r8.ir.code.Invoke;
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.DexBuilder;
@@ -64,8 +63,6 @@
import com.android.tools.r8.ir.optimize.inliner.WhyAreYouNotInliningReporter;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
-import com.android.tools.r8.ir.synthetic.ForwardMethodSourceCode;
-import com.android.tools.r8.ir.synthetic.SynthesizedCode;
import com.android.tools.r8.kotlin.KotlinMethodLevelInfo;
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
@@ -1303,20 +1300,17 @@
// Some debuggers (like IntelliJ) automatically skip synthetic methods on single step.
newFlags.setSynthetic();
newFlags.unsetAbstract();
- ForwardMethodSourceCode.Builder forwardSourceCodeBuilder =
- ForwardMethodSourceCode.builder(newMethod);
- forwardSourceCodeBuilder
- .setReceiver(clazz.type)
- .setTarget(forwardMethod)
- .setInvokeType(Invoke.Type.STATIC)
- .setIsInterface(false); // Holder is companion class, or retarget method, not an interface.
return new DexEncodedMethod(
newMethod,
newFlags,
MethodTypeSignature.noSignature(),
DexAnnotationSet.empty(),
ParameterAnnotationsList.empty(),
- new SynthesizedCode(forwardSourceCodeBuilder::build),
+ ForwardMethodBuilder.builder(factory)
+ .setNonStaticSource(newMethod)
+ // Holder is companion class, or retarget method, not an interface.
+ .setStaticTarget(forwardMethod, false)
+ .build(),
true);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
index 4c784f0..3381ece 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
@@ -4,9 +4,15 @@
package com.android.tools.r8.ir.desugar.itf;
+import com.android.tools.r8.cf.code.CfInvoke;
+import com.android.tools.r8.cf.code.CfNew;
+import com.android.tools.r8.cf.code.CfStackInstruction;
+import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
+import com.android.tools.r8.cf.code.CfThrow;
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.DexAnnotationSet;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexClass;
@@ -24,10 +30,9 @@
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.ResolutionResult;
-import com.android.tools.r8.ir.synthetic.ExceptionThrowingSourceCode;
-import com.android.tools.r8.ir.synthetic.SynthesizedCode;
import com.android.tools.r8.position.MethodPosition;
import com.android.tools.r8.utils.BooleanBox;
+import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.IterableUtils;
import com.android.tools.r8.utils.MethodSignatureEquivalence;
import com.android.tools.r8.utils.WorkList;
@@ -756,21 +761,43 @@
if (!clazz.isProgramClass()) {
return;
}
- DexMethod newMethod = dexItemFactory.createMethod(clazz.type, method.proto, method.name);
+ MethodAccessFlags accessFlags = MethodAccessFlags.builder().setPublic().build();
+ DexMethod newMethod = method.withHolder(clazz.getType(), dexItemFactory);
DexEncodedMethod newEncodedMethod =
new DexEncodedMethod(
newMethod,
- MethodAccessFlags.fromCfAccessFlags(Opcodes.ACC_PUBLIC, false),
+ accessFlags,
MethodTypeSignature.noSignature(),
DexAnnotationSet.empty(),
ParameterAnnotationsList.empty(),
- new SynthesizedCode(
- (ignored, callerPosition) ->
- new ExceptionThrowingSourceCode(clazz.type, method, callerPosition, errorType)),
+ createExceptionThrowingCfCode(newMethod, accessFlags, errorType, dexItemFactory),
true);
addSyntheticMethod(clazz.asProgramClass(), newEncodedMethod);
}
+ private static CfCode createExceptionThrowingCfCode(
+ DexMethod method,
+ MethodAccessFlags accessFlags,
+ DexType exceptionType,
+ DexItemFactory dexItemFactory) {
+ DexMethod instanceInitializer =
+ dexItemFactory.createMethod(
+ exceptionType,
+ dexItemFactory.createProto(dexItemFactory.voidType),
+ dexItemFactory.constructorMethodName);
+ int maxStack = 2;
+ int maxLocals = method.getParameters().size() + BooleanUtils.intValue(!accessFlags.isStatic());
+ return new CfCode(
+ method.getHolderType(),
+ maxStack,
+ maxLocals,
+ ImmutableList.of(
+ new CfNew(exceptionType),
+ new CfStackInstruction(Opcode.Dup),
+ new CfInvoke(Opcodes.INVOKESPECIAL, instanceInitializer, false),
+ new CfThrow()));
+ }
+
// Note: The parameter 'target' may be a public method on a class in case of desugared
// library retargeting (See below target.isInterface check).
private void addForwardingMethod(DexClassAndMethod target, DexClass clazz) {
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
index c89cb3e..eb56742 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
@@ -17,7 +17,7 @@
this(sourceCodeProvider, SynthesizedCode::registerReachableDefinitionsDefault);
}
- public SynthesizedCode(SourceCodeProvider sourceCodeProvider, Consumer<UseRegistry> callback) {
+ private SynthesizedCode(SourceCodeProvider sourceCodeProvider, Consumer<UseRegistry> callback) {
this.sourceCodeProvider = sourceCodeProvider;
this.registryCallback = callback;
}