| // Copyright (c) 2023, 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.graph.lens; |
| |
| import com.android.tools.r8.graph.DexMethod; |
| import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription; |
| import com.android.tools.r8.ir.code.InvokeType; |
| import com.android.tools.r8.optimize.bridgehoisting.BridgeHoistingLens; |
| |
| /** |
| * Result of a method lookup in a GraphLens. |
| * |
| * <p>This provides the new target and invoke type to use, along with a description of the prototype |
| * changes that have been made to the target method and the corresponding required changes to the |
| * invoke arguments. |
| */ |
| public class MethodLookupResult extends MemberLookupResult<DexMethod> { |
| |
| private final InvokeType type; |
| private final RewrittenPrototypeDescription prototypeChanges; |
| |
| public MethodLookupResult( |
| DexMethod reference, |
| DexMethod reboundReference, |
| InvokeType type, |
| RewrittenPrototypeDescription prototypeChanges) { |
| super(reference, reboundReference); |
| this.type = type; |
| this.prototypeChanges = prototypeChanges; |
| } |
| |
| public static Builder builder(GraphLens lens, GraphLens codeLens) { |
| return new Builder(lens, codeLens); |
| } |
| |
| public InvokeType getType() { |
| return type; |
| } |
| |
| public RewrittenPrototypeDescription getPrototypeChanges() { |
| return prototypeChanges; |
| } |
| |
| public MethodLookupResult verify(GraphLens lens, GraphLens codeLens) { |
| assert getReference() != null; |
| assert lens.isIdentityLens() |
| || lens.isAppliedLens() |
| || lens.asNonIdentityLens().isD8Lens() |
| || getReference().getHolderType().isArrayType() |
| || hasReboundReference() |
| // TODO: Disallow the following. |
| || lens.isEnumUnboxerLens() |
| || lens.isNumberUnboxerLens() |
| || lens instanceof BridgeHoistingLens |
| : lens; |
| return this; |
| } |
| |
| public static class Builder extends MemberLookupResult.Builder<DexMethod, Builder> { |
| |
| private final GraphLens lens; |
| private final GraphLens codeLens; |
| |
| private RewrittenPrototypeDescription prototypeChanges = RewrittenPrototypeDescription.none(); |
| private InvokeType type; |
| |
| private Builder(GraphLens lens, GraphLens codeLens) { |
| this.lens = lens; |
| this.codeLens = codeLens; |
| } |
| |
| public Builder setPrototypeChanges(RewrittenPrototypeDescription prototypeChanges) { |
| this.prototypeChanges = prototypeChanges; |
| return this; |
| } |
| |
| public Builder setType(InvokeType type) { |
| this.type = type; |
| return this; |
| } |
| |
| public MethodLookupResult build() { |
| return new MethodLookupResult(reference, reboundReference, type, prototypeChanges) |
| .verify(lens, codeLens); |
| } |
| |
| @Override |
| public Builder self() { |
| return this; |
| } |
| } |
| } |