blob: 38056c855b13606045defde95a7e9ef38d91b79b [file] [log] [blame]
// 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;
}
}