blob: 3865bc153ee1f26d1ebd1f954dfef3688ba2b01d [file] [log] [blame]
// Copyright (c) 2019, 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.info.initializer;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet;
import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public abstract class InstanceInitializerInfo {
public boolean isDefaultInstanceInitializerInfo() {
return false;
}
public boolean isNonTrivialInstanceInitializerInfo() {
return false;
}
public NonTrivialInstanceInitializerInfo asNonTrivialInstanceInitializerInfo() {
return null;
}
public abstract DexMethod getParent();
public abstract InstanceFieldInitializationInfoCollection fieldInitializationInfos();
/**
* Returns an abstraction of the set of fields that may be as a result of executing this
* initializer.
*/
public abstract AbstractFieldSet readSet();
/**
* Returns true if one of the instance fields on the enclosing class may be initialized with a
* value that may depend on the runtime environment by this constructor.
*
* <p>Example: returns false if all fields are assigned with one of the arguments or a constant.
*
* <p>Example: returns true if a field is assigned with the value of a static-get instruction that
* reads a field from a different class.
*/
public abstract boolean instanceFieldInitializationMayDependOnEnvironment();
/**
* Returns false if the only side effects that this initializer may have is the instance-put
* instructions that assign a field on the enclosing class.
*
* <p>Example: returns true if the initializer invokes {@link java.io.PrintStream#println()}.
*
* <p>Example: returns false if the initializer merely assigns the value of one of the arguments
* or a constant to an instance-field on the enclosing class.
*/
public abstract boolean mayHaveOtherSideEffectsThanInstanceFieldAssignments();
/**
* The receiver always escapes from a constructor, since it is passed to the constructor in the
* super class. This method returns true if the receiver never escapes outside this constructor or
* any of its (transitive) super constructors.
*/
public abstract boolean receiverNeverEscapesOutsideConstructorChain();
public final boolean receiverMayEscapeOutsideConstructorChain() {
return !receiverNeverEscapesOutsideConstructorChain();
}
public abstract InstanceInitializerInfo rewrittenWithLens(
AppView<AppInfoWithLiveness> appView, GraphLens lens);
}