| // 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.optimize; |
| |
| import com.android.tools.r8.graph.DexField; |
| import com.android.tools.r8.graph.DexItemFactory; |
| import com.android.tools.r8.graph.DexMethod; |
| import com.android.tools.r8.graph.DexType; |
| import com.android.tools.r8.graph.UseRegistry; |
| |
| public class InvokeSingleTargetExtractor extends UseRegistry { |
| private InvokeKind kind = InvokeKind.NONE; |
| private DexMethod target; |
| |
| public InvokeSingleTargetExtractor(DexItemFactory factory) { |
| super(factory); |
| } |
| |
| private void setTarget(DexMethod target, InvokeKind kind) { |
| if (this.kind != InvokeKind.NONE) { |
| this.kind = InvokeKind.ILLEGAL; |
| this.target = null; |
| } else { |
| assert this.target == null; |
| this.target = target; |
| this.kind = kind; |
| } |
| } |
| |
| private void invalid() { |
| kind = InvokeKind.ILLEGAL; |
| } |
| |
| public DexMethod getTarget() { |
| return target; |
| } |
| |
| public InvokeKind getKind() { |
| return kind; |
| } |
| |
| @Override |
| public void registerInitClass(DexType clazz) { |
| invalid(); |
| } |
| |
| @Override |
| public void registerInvokeVirtual(DexMethod method) { |
| setTarget(method, InvokeKind.VIRTUAL); |
| } |
| |
| @Override |
| public void registerInvokeDirect(DexMethod method) { |
| invalid(); |
| } |
| |
| @Override |
| public void registerInvokeStatic(DexMethod method) { |
| setTarget(method, InvokeKind.STATIC); |
| } |
| |
| @Override |
| public void registerInvokeInterface(DexMethod method) { |
| invalid(); |
| } |
| |
| @Override |
| public void registerInvokeSuper(DexMethod method) { |
| setTarget(method, InvokeKind.SUPER); |
| } |
| |
| @Override |
| public void registerInstanceFieldWrite(DexField field) { |
| invalid(); |
| } |
| |
| @Override |
| public void registerInstanceFieldRead(DexField field) { |
| invalid(); |
| } |
| |
| @Override |
| public void registerNewInstance(DexType type) { |
| invalid(); |
| } |
| |
| @Override |
| public void registerStaticFieldRead(DexField field) { |
| invalid(); |
| } |
| |
| @Override |
| public void registerStaticFieldWrite(DexField field) { |
| invalid(); |
| } |
| |
| @Override |
| public void registerTypeReference(DexType type) { |
| invalid(); |
| } |
| |
| @Override |
| public void registerInstanceOf(DexType type) { |
| invalid(); |
| } |
| |
| public enum InvokeKind { |
| VIRTUAL, |
| STATIC, |
| SUPER, |
| ILLEGAL, |
| NONE |
| } |
| } |