// Copyright © 2013-2015 Esko Luontola <www.orfjackal.net>
// This software is released under the Apache License 2.0.
// The license text is at http://www.apache.org/licenses/LICENSE-2.0
package net.orfjackal.retrolambda.lambdas;
import net.orfjackal.retrolambda.util.Flags;
import org.objectweb.asm.Handle;
import static org.objectweb.asm.Opcodes.*;
public class Handles {
public static int getOpcode(Handle handle) {
int tag = handle.getTag();
switch (tag) {
case H_INVOKEVIRTUAL:
return INVOKEVIRTUAL;
case H_INVOKESTATIC:
return INVOKESTATIC;
case H_INVOKESPECIAL:
return INVOKESPECIAL;
case H_NEWINVOKESPECIAL:
return INVOKESPECIAL; // we assume that the caller takes care of the NEW instruction
case H_INVOKEINTERFACE:
return INVOKEINTERFACE;
default:
throw new IllegalArgumentException("Unsupported tag " + tag + " in " + handle);
}
}
public static int opcodeToTag(int opcode) {
switch (opcode) {
case INVOKEVIRTUAL:
return H_INVOKEVIRTUAL;
case INVOKESTATIC:
return H_INVOKESTATIC;
case INVOKESPECIAL:
return H_INVOKESPECIAL;
case INVOKEINTERFACE:
return H_INVOKEINTERFACE;
default:
throw new IllegalArgumentException("Unsupported opcode " + opcode);
}
}
public static int accessToTag(int access, boolean itf) {
if (Flags.hasFlag(access, ACC_STATIC)) {
return H_INVOKESTATIC;
}
if (Flags.hasFlag(access, ACC_PRIVATE)) {
return H_INVOKESPECIAL;
}
if (itf) {
return H_INVOKEINTERFACE;
} else {
return H_INVOKEVIRTUAL;
}
}
}