Clean up use of isConstructor getter.
Bug:
Change-Id: Iba5c8df796c2b80680e91346f12f799e07eac978
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index 332f292..bdcbafe 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -5,8 +5,6 @@
import static com.android.tools.r8.utils.LebUtils.sizeAsUleb128;
-import com.google.common.collect.Sets;
-
import com.android.tools.r8.code.Instruction;
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.graph.AppInfo;
@@ -51,12 +49,11 @@
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.LebUtils;
-
+import com.google.common.collect.Sets;
import it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Reference2IntLinkedOpenHashMap;
import it.unimi.dsi.fastutil.objects.Reference2IntMap;
-
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Arrays;
@@ -297,7 +294,7 @@
}
} else {
- if (method.accessFlags.isConstructor()) {
+ if (method.isInstanceInitializer()) {
throw new CompilationError(
"Interface must not have constructors: " + method.method.toSourceString());
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 04c61a4..d09d395 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -175,12 +175,8 @@
}
public DexEncodedMethod getClassInitializer() {
- for (DexEncodedMethod method : directMethods()) {
- if (method.accessFlags.isConstructor() && method.accessFlags.isStatic()) {
- return method;
- }
- }
- return null;
+ return Arrays.stream(directMethods()).filter(DexEncodedMethod::isClassInitializer).findAny()
+ .orElse(null);
}
public Resource.Kind getOrigin() {
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 947ab44..700e45a 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -98,22 +98,21 @@
return compilationState != CompilationState.NOT_PROCESSED;
}
- public boolean cannotInline() {
- return compilationState == CompilationState.NOT_PROCESSED
- || compilationState == CompilationState.PROCESSED_NOT_INLINING_CANDIDATE;
+ public boolean isInstanceInitializer() {
+ return accessFlags.isConstructor() && !accessFlags.isStatic();
+ }
+
+ public boolean isClassInitializer() {
+ return accessFlags.isConstructor() && accessFlags.isStatic();
}
public boolean isInliningCandidate(DexEncodedMethod container, boolean alwaysInline,
AppInfoWithSubtyping appInfo) {
- if (container.accessFlags.isStatic() && container.accessFlags.isConstructor()) {
+ if (isClassInitializer()) {
// This will probably never happen but never inline a class initializer.
return false;
}
if (alwaysInline) {
- // Only inline constructor iff holder classes are equal.
- if (!accessFlags.isStatic() && accessFlags.isConstructor()) {
- return container.method.getHolder() == method.getHolder();
- }
return true;
}
switch (compilationState) {
@@ -307,10 +306,10 @@
itemFactory.stringType),
itemFactory.constructorMethodName);
DexCode code;
- if (accessFlags.isConstructor() && !accessFlags.isStatic()) {
+ if (isInstanceInitializer()) {
// The Java VM Spec requires that a constructor calls an initializer from the super class
// or another constructor from the current class. For simplicity we do the latter by just
- // calling outself. This is ok, as the constructor always throws before the recursive call.
+ // calling ourself. This is ok, as the constructor always throws before the recursive call.
code = generateCodeFromTemplate(3, 2, new ConstStringJumbo(0, tag),
new ConstStringJumbo(1, message),
new InvokeStatic(2, logMethod, 0, 1, 0, 0, 0),
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index d3a5676..60a7319 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -148,7 +148,6 @@
public void addStaticMethod(DexEncodedMethod staticMethod) {
assert staticMethod.accessFlags.isStatic();
assert !staticMethod.accessFlags.isPrivate();
- assert !staticMethod.accessFlags.isConstructor();
directMethods = Arrays.copyOf(directMethods, directMethods.length + 1);
directMethods[directMethods.length - 1] = staticMethod;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index b017db0..942e8f0 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -256,8 +256,7 @@
// Allow inlining a constructor into a constructor of the same class, as the constructor code
// is expected to adhere to the VM specification.
DexType methodHolder = method.method.holder;
- boolean methodIsConstructor =
- method.accessFlags.isConstructor() && !method.accessFlags.isStatic();
+ boolean methodIsConstructor = method.isInstanceInitializer();
if (methodIsConstructor && methodHolder == invoke.asInvokeMethod().getInvokedMethod().holder) {
return true;
}
@@ -370,8 +369,8 @@
performInlining(target, inlinee, callGraph);
}
// Make sure constructor inlining is legal.
- if (target.accessFlags.isConstructor()
- && !target.accessFlags.isStatic()
+ assert !target.isClassInitializer();
+ if (target.isInstanceInitializer()
&& !legalConstructorInline(method, invoke, inlinee)) {
continue;
}
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java b/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
index 1e2d6d4..f3e6c6f 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
@@ -200,7 +200,7 @@
public boolean matches(DexEncodedMethod method, RootSetBuilder builder) {
switch (getRuleType()) {
case ALL_METHODS:
- if (method.accessFlags.isConstructor() && method.accessFlags.isStatic()) {
+ if (method.isClassInitializer()) {
break;
}
case ALL:
diff --git a/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java b/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java
index e01439d..d3306d9 100644
--- a/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java
@@ -379,7 +379,7 @@
private DexEncodedMethod renameConstructors(DexEncodedMethod method) {
// Only rename instance initializers.
- if (!method.accessFlags.isConstructor() || method.accessFlags.isStatic()) {
+ if (!method.isInstanceInitializer()) {
return method;
}
DexType holder = method.method.holder;
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index 2a5c9e0..d8fd6c2 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -113,7 +113,7 @@
}
private boolean isDefaultConstructor(DexEncodedMethod method) {
- return method.accessFlags.isConstructor() && !method.accessFlags.isStatic()
+ return method.isInstanceInitializer()
&& method.method.proto.parameters.isEmpty();
}