| // 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.ir.optimize.classinliner.analysis; |
| |
| import com.android.tools.r8.errors.Unreachable; |
| import com.android.tools.r8.graph.DexField; |
| import com.android.tools.r8.graph.DexMethod; |
| import com.android.tools.r8.graph.DexType; |
| import com.android.tools.r8.ir.code.InvokeMethodWithReceiver; |
| import com.android.tools.r8.utils.BooleanUtils; |
| import com.google.common.collect.Multiset; |
| import java.util.Objects; |
| import java.util.Set; |
| |
| public class NonEmptyParameterUsage extends ParameterUsage { |
| |
| private Set<DexType> castsWithParameter; |
| private Set<DexField> fieldsReadFromParameter; |
| private Multiset<DexMethod> methodCallsWithParameterAsReceiver; |
| |
| private boolean isParameterMutated; |
| private boolean isParameterReturned; |
| private boolean isParameterUsedAsLock; |
| |
| NonEmptyParameterUsage( |
| Set<DexType> castsWithParameter, |
| Set<DexField> fieldsReadFromParameter, |
| Multiset<DexMethod> methodCallsWithParameterAsReceiver, |
| boolean isParameterMutated, |
| boolean isParameterReturned, |
| boolean isParameterUsedAsLock) { |
| assert !castsWithParameter.isEmpty() |
| || !fieldsReadFromParameter.isEmpty() |
| || !methodCallsWithParameterAsReceiver.isEmpty() |
| || isParameterMutated |
| || isParameterReturned |
| || isParameterUsedAsLock; |
| this.castsWithParameter = castsWithParameter; |
| this.fieldsReadFromParameter = fieldsReadFromParameter; |
| this.methodCallsWithParameterAsReceiver = methodCallsWithParameterAsReceiver; |
| this.isParameterMutated = isParameterMutated; |
| this.isParameterReturned = isParameterReturned; |
| this.isParameterUsedAsLock = isParameterUsedAsLock; |
| } |
| |
| @Override |
| ParameterUsage addCastWithParameter(DexType castType) { |
| throw new Unreachable(); |
| } |
| |
| @Override |
| ParameterUsage addFieldReadFromParameter(DexField field) { |
| throw new Unreachable(); |
| } |
| |
| @Override |
| ParameterUsage addMethodCallWithParameterAsReceiver(InvokeMethodWithReceiver invoke) { |
| throw new Unreachable(); |
| } |
| |
| @Override |
| public NonEmptyParameterUsage asNonEmpty() { |
| return this; |
| } |
| |
| @Override |
| ParameterUsage externalize() { |
| throw new Unreachable(); |
| } |
| |
| public boolean hasFieldsReadFromParameter() { |
| return !getFieldsReadFromParameter().isEmpty(); |
| } |
| |
| public Set<DexType> getCastsWithParameter() { |
| return castsWithParameter; |
| } |
| |
| public Set<DexField> getFieldsReadFromParameter() { |
| return fieldsReadFromParameter; |
| } |
| |
| public Multiset<DexMethod> getMethodCallsWithParameterAsReceiver() { |
| return methodCallsWithParameterAsReceiver; |
| } |
| |
| @Override |
| public boolean isParameterMutated() { |
| return isParameterMutated; |
| } |
| |
| @Override |
| public boolean isParameterReturned() { |
| return isParameterReturned; |
| } |
| |
| @Override |
| public boolean isParameterUsedAsLock() { |
| return isParameterUsedAsLock; |
| } |
| |
| @Override |
| ParameterUsage setParameterMutated() { |
| throw new Unreachable(); |
| } |
| |
| @Override |
| ParameterUsage setParameterReturned() { |
| throw new Unreachable(); |
| } |
| |
| @Override |
| ParameterUsage setParameterUsedAsLock() { |
| throw new Unreachable(); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (obj == this) { |
| return true; |
| } |
| if (obj == null || obj.getClass() != getClass()) { |
| return false; |
| } |
| NonEmptyParameterUsage knownParameterUsage = (NonEmptyParameterUsage) obj; |
| return isParameterMutated == knownParameterUsage.isParameterMutated |
| && isParameterReturned == knownParameterUsage.isParameterReturned |
| && isParameterUsedAsLock == knownParameterUsage.isParameterUsedAsLock |
| && castsWithParameter.equals(knownParameterUsage.castsWithParameter) |
| && fieldsReadFromParameter.equals(knownParameterUsage.fieldsReadFromParameter) |
| && methodCallsWithParameterAsReceiver.equals( |
| knownParameterUsage.methodCallsWithParameterAsReceiver); |
| } |
| |
| @Override |
| public int hashCode() { |
| int hash = |
| 31 * (31 * (31 + castsWithParameter.hashCode()) + fieldsReadFromParameter.hashCode()) |
| + methodCallsWithParameterAsReceiver.hashCode(); |
| assert hash |
| == Objects.hash( |
| castsWithParameter, fieldsReadFromParameter, methodCallsWithParameterAsReceiver); |
| hash = (hash << 1) | BooleanUtils.intValue(isParameterMutated); |
| hash = (hash << 1) | BooleanUtils.intValue(isParameterReturned); |
| hash = (hash << 1) | BooleanUtils.intValue(isParameterUsedAsLock); |
| return hash; |
| } |
| } |