blob: f29af8896a87222301c46b340058483b442a93cb [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.retrace.internal;
import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
import com.android.tools.r8.naming.mappinginformation.RewriteFrameMappingInformation;
import com.android.tools.r8.naming.mappinginformation.RewriteFrameMappingInformation.Condition;
import com.android.tools.r8.naming.mappinginformation.RewriteFrameMappingInformation.RewriteAction;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.retrace.RetraceStackTraceContext;
import java.util.List;
import java.util.OptionalInt;
public class RetraceStackTraceContextImpl implements RetraceStackTraceContext {
private final ClassReference thrownException;
private final OptionalInt rewritePosition;
private RetraceStackTraceContextImpl(
ClassReference thrownException, OptionalInt rewritePosition) {
this.thrownException = thrownException;
this.rewritePosition = rewritePosition;
}
public ClassReference getThrownException() {
return thrownException;
}
RetraceStackTraceCurrentEvaluationInformation computeRewriteFrameInformation(
List<MappedRange> mappedRanges) {
if (mappedRanges == null || mappedRanges.isEmpty()) {
return RetraceStackTraceCurrentEvaluationInformation.empty();
}
RetraceStackTraceCurrentEvaluationInformation.Builder builder =
RetraceStackTraceCurrentEvaluationInformation.builder();
for (MappedRange mappedRange : mappedRanges) {
for (RewriteFrameMappingInformation rewriteInformation :
mappedRange.getRewriteFrameMappingInformation()) {
if (evaluateConditions(rewriteInformation.getConditions())) {
for (RewriteAction action : rewriteInformation.getActions()) {
action.evaluate(builder);
}
}
}
}
return builder.build();
}
public boolean hasRewritePosition() {
return rewritePosition.isPresent();
}
public int getRewritePosition() {
return rewritePosition.getAsInt();
}
private boolean evaluateConditions(List<Condition> conditions) {
for (Condition condition : conditions) {
if (!condition.evaluate(this)) {
return false;
}
}
return true;
}
public static Builder builder() {
return Builder.create();
}
public Builder buildFromThis() {
return builder().setThrownException(thrownException).setRewritePosition(rewritePosition);
}
public static class Builder {
private ClassReference thrownException;
private OptionalInt rewritePosition = OptionalInt.empty();
private Builder() {}
public Builder setThrownException(ClassReference thrownException) {
this.thrownException = thrownException;
return this;
}
public Builder setRewritePosition(OptionalInt rewritePosition) {
this.rewritePosition = rewritePosition;
return this;
}
public Builder clearRewritePosition() {
this.rewritePosition = OptionalInt.empty();
return this;
}
public RetraceStackTraceContextImpl build() {
return new RetraceStackTraceContextImpl(thrownException, rewritePosition);
}
public static Builder create() {
return new Builder();
}
}
}