| // Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package com.android.tools.r8.graph; |
| |
| import com.google.common.collect.ImmutableSet; |
| import java.util.Set; |
| |
| // Flags set based on the application when it was read. |
| // Note that in r8, once classes are pruned, the flags may not reflect the application anymore. |
| public class DexApplicationReadFlags { |
| |
| public static class Builder { |
| |
| private boolean hasReadProgramClassFromDex; |
| private boolean hasReadProgramClassFromCf; |
| private final ImmutableSet.Builder<DexType> recordWitnessesBuilder = ImmutableSet.builder(); |
| private final ImmutableSet.Builder<DexType> varHandleWitnessesBuilder = ImmutableSet.builder(); |
| private final ImmutableSet.Builder<DexType> methodHandlesLookupWitnessesBuilder = |
| ImmutableSet.builder(); |
| |
| private Builder() {} |
| |
| public Builder setHasReadProgramClassFromDex(boolean value) { |
| hasReadProgramClassFromDex = value; |
| return this; |
| } |
| |
| public Builder setHasReadProgramClassFromCf(boolean value) { |
| hasReadProgramClassFromCf = value; |
| return this; |
| } |
| |
| public Builder addRecordWitness(DexType witness) { |
| synchronized (recordWitnessesBuilder) { |
| recordWitnessesBuilder.add(witness); |
| } |
| return this; |
| } |
| |
| public Builder addVarHandleWitness(DexType witness) { |
| synchronized (varHandleWitnessesBuilder) { |
| varHandleWitnessesBuilder.add(witness); |
| } |
| return this; |
| } |
| |
| public Builder addMethodHandlesLookupWitness(DexType witness) { |
| synchronized (methodHandlesLookupWitnessesBuilder) { |
| methodHandlesLookupWitnessesBuilder.add(witness); |
| } |
| return this; |
| } |
| |
| public DexApplicationReadFlags build() { |
| return new DexApplicationReadFlags( |
| hasReadProgramClassFromDex, |
| hasReadProgramClassFromCf, |
| recordWitnessesBuilder.build(), |
| varHandleWitnessesBuilder.build(), |
| methodHandlesLookupWitnessesBuilder.build()); |
| } |
| } |
| |
| private final boolean hasReadProgramClassFromDex; |
| private final boolean hasReadProgramClassFromCf; |
| private final Set<DexType> recordWitnesses; |
| private final Set<DexType> varHandleWitnesses; |
| private final Set<DexType> methodHandlesLookupWitnesses; |
| |
| public static Builder builder() { |
| return new Builder(); |
| } |
| |
| private DexApplicationReadFlags( |
| boolean hasReadProgramClassFromDex, |
| boolean hasReadProgramClassFromCf, |
| Set<DexType> recordWitnesses, |
| Set<DexType> varHandleWitnesses, |
| Set<DexType> methodHandlesLookupWitnesses) { |
| this.hasReadProgramClassFromDex = hasReadProgramClassFromDex; |
| this.hasReadProgramClassFromCf = hasReadProgramClassFromCf; |
| this.recordWitnesses = recordWitnesses; |
| this.varHandleWitnesses = varHandleWitnesses; |
| this.methodHandlesLookupWitnesses = methodHandlesLookupWitnesses; |
| } |
| |
| public boolean hasReadProgramClassFromCf() { |
| return hasReadProgramClassFromCf; |
| } |
| |
| public boolean hasReadProgramClassFromDex() { |
| return hasReadProgramClassFromDex; |
| } |
| |
| public boolean hasReadRecordReferenceFromProgramClass() { |
| return !recordWitnesses.isEmpty(); |
| } |
| |
| public Set<DexType> getRecordWitnesses() { |
| return recordWitnesses; |
| } |
| |
| public boolean hasReadMethodHandlesLookupReferenceFromProgramClass() { |
| return !methodHandlesLookupWitnesses.isEmpty(); |
| } |
| |
| public Set<DexType> getMethodHandlesLookupWitnesses() { |
| return methodHandlesLookupWitnesses; |
| } |
| |
| public boolean hasReadVarHandleReferenceFromProgramClass() { |
| return !varHandleWitnesses.isEmpty(); |
| } |
| |
| public Set<DexType> getVarHandleWitnesses() { |
| return varHandleWitnesses; |
| } |
| } |