blob: 82ea7ef81c9a37e785e6aec07557efcb69f0fca1 [file] [log] [blame]
// Copyright (c) 2022, 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.cf.code;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig;
import java.util.Optional;
public class CfFrameVerifierDefaultAnalysisConfig implements CfAnalysisConfig {
private final CfAssignability assignability;
private final CfCode code;
private final ProgramMethod method;
private final Optional<DexMethod> previousMethod;
CfFrameVerifierDefaultAnalysisConfig(
AppView<?> appView, CfCode code, ProgramMethod method, Optional<DexMethod> previousMethod) {
this.assignability = new CfAssignability(appView);
this.code = code;
this.method = method;
this.previousMethod = previousMethod;
}
@Override
public CfAssignability getAssignability() {
return assignability;
}
@Override
public DexMethod getCurrentContext() {
return previousMethod.orElse(method.getReference());
}
@Override
public int getMaxLocals() {
return code.getMaxLocals();
}
@Override
public int getMaxStack() {
return code.getMaxStack();
}
@Override
public boolean isImmediateSuperClassOfCurrentContext(DexType type) {
// If the code is rewritten according to the graph lens, we perform a strict check that the
// given type is the same as the current holder's super class.
if (!previousMethod.isPresent()) {
return type == method.getHolder().getSuperType();
}
// Otherwise, we don't know what the super class of the current class was at the point of the
// code lens. We return true, which has the consequence that we may accept a constructor call
// for an uninitialized-this value where the constructor is not defined in the immediate parent
// class.
return true;
}
@Override
public boolean isStrengthenFramesEnabled() {
return false;
}
}