blob: fadc2230787cbde230b6398ca7cba5525f962d25 [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.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
}
}