blob: 9689d223be47e784b3d0e4610010ece77c23cc4c [file] [log] [blame]
// Copyright (c) 2017, 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.code;
import com.android.tools.r8.cf.LoadStoreHelper;
import com.android.tools.r8.cf.TypeVerificationHelper;
import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
import com.android.tools.r8.ir.optimize.InliningOracle;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import java.util.Collection;
import java.util.List;
public abstract class InvokeMethod extends Invoke {
private final DexMethod method;
public InvokeMethod(DexMethod target, Value result, List<Value> arguments) {
super(result, arguments);
this.method = target;
}
@Override
public DexType getReturnType() {
return method.proto.returnType;
}
public DexMethod getInvokedMethod() {
return method;
}
@Override
public boolean identicalNonValueNonPositionParts(Instruction other) {
return other.isInvokeMethod() && method == other.asInvokeMethod().getInvokedMethod();
}
@Override
public int compareNonValueParts(Instruction other) {
return getInvokedMethod().slowCompareTo(other.asInvokeMethod().getInvokedMethod());
}
@Override
public String toString() {
return super.toString() + "; method: " + method.toSourceString();
}
@Override
public boolean isInvokeMethod() {
return true;
}
@Override
public InvokeMethod asInvokeMethod() {
return this;
}
// In subclasses, e.g., invoke-virtual or invoke-super, use a narrower receiver type by using
// receiver type and calling context---the holder of the method where the current invocation is.
public abstract DexEncodedMethod lookupSingleTarget(
AppInfoWithLiveness appInfo, DexType invocationContext);
public abstract Collection<DexEncodedMethod> lookupTargets(
AppInfoWithSubtyping appInfo, DexType invocationContext);
public abstract InlineAction computeInlining(InliningOracle decider, DexType invocationContext);
@Override
public void insertLoadAndStores(InstructionListIterator it, LoadStoreHelper helper) {
helper.loadInValues(this, it);
if (getReturnType().isVoidType()) {
return;
}
if (outValue == null) {
helper.popOutType(getReturnType(), this, it);
} else {
assert outValue.isUsed();
helper.storeOutValue(this, it);
}
}
@Override
public boolean hasInvariantOutType() {
return true;
}
@Override
public DexType computeVerificationType(TypeVerificationHelper helper) {
return getReturnType();
}
}