下面列出了怎么用org.objectweb.asm.tree.LdcInsnNode的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Generates instructions for generating marker instructions. These marker instructions are meant to be is useful for debugging
* instrumented code. For example, you can spot a specific portion of instrumented code by looking for specific markers in the assembly
* output.
* @param markerType marker type (determines what kind of instructions are generated)
* @param text text to print out
* @return instructions to call System.out.println with a string constant
* @throws NullPointerException if any argument is {@code null}
*/
public static InsnList debugMarker(MarkerType markerType, String text) {
Validate.notNull(markerType);
Validate.notNull(text);
InsnList ret = new InsnList();
switch (markerType) {
case NONE:
break;
case CONSTANT:
ret.add(new LdcInsnNode(text));
ret.add(new InsnNode(Opcodes.POP));
break;
case STDOUT:
ret.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"));
ret.add(new LdcInsnNode(text));
ret.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false));
break;
default:
throw new IllegalStateException();
}
return ret;
}
@Override
public SourceValue newOperation(final AbstractInsnNode insn) {
int size;
switch (insn.getOpcode()) {
case LCONST_0:
case LCONST_1:
case DCONST_0:
case DCONST_1:
size = 2;
break;
case LDC:
Object value = ((LdcInsnNode) insn).cst;
size = value instanceof Long || value instanceof Double ? 2 : 1;
break;
case GETSTATIC:
size = Type.getType(((FieldInsnNode) insn).desc).getSize();
break;
default:
size = 1;
break;
}
return new SourceValue(size, insn);
}
@Override
public SourceValue newOperation(final AbstractInsnNode insn) {
int size;
switch (insn.getOpcode()) {
case LCONST_0:
case LCONST_1:
case DCONST_0:
case DCONST_1:
size = 2;
break;
case LDC:
Object value = ((LdcInsnNode) insn).cst;
size = value instanceof Long || value instanceof Double ? 2 : 1;
break;
case GETSTATIC:
size = Type.getType(((FieldInsnNode) insn).desc).getSize();
break;
default:
size = 1;
break;
}
return new SourceValue(size, insn);
}
/**
* Given an integer, returns an InsnNode that will properly represent the int.
*
* @param i
* @return
*/
public static AbstractInsnNode toInt(int i) {
switch (i) {
case -1:
return new InsnNode(Opcodes.ICONST_M1);
case 0:
return new InsnNode(Opcodes.ICONST_0);
case 1:
return new InsnNode(Opcodes.ICONST_1);
case 2:
return new InsnNode(Opcodes.ICONST_2);
case 3:
return new InsnNode(Opcodes.ICONST_3);
case 4:
return new InsnNode(Opcodes.ICONST_4);
case 5:
return new InsnNode(Opcodes.ICONST_5);
}
if (i > -129 && i < 128) {
return new IntInsnNode(Opcodes.BIPUSH, i);
}
return new LdcInsnNode(i);
}
@Override
public SourceValue newOperation(final AbstractInsnNode insn) {
int size;
switch (insn.getOpcode()) {
case LCONST_0:
case LCONST_1:
case DCONST_0:
case DCONST_1:
size = 2;
break;
case LDC:
Object value = ((LdcInsnNode) insn).cst;
size = value instanceof Long || value instanceof Double ? 2 : 1;
break;
case GETSTATIC:
size = Type.getType(((FieldInsnNode) insn).desc).getSize();
break;
default:
size = 1;
break;
}
return new SourceValue(size, insn);
}
/**
* Given an integer, returns an InsnNode that will properly represent the
* int.
*
* @param i
* @return
*/
public static AbstractInsnNode toInt(int i) {
switch (i) {
case -1:
return new InsnNode(Opcodes.ICONST_M1);
case 0:
return new InsnNode(Opcodes.ICONST_0);
case 1:
return new InsnNode(Opcodes.ICONST_1);
case 2:
return new InsnNode(Opcodes.ICONST_2);
case 3:
return new InsnNode(Opcodes.ICONST_3);
case 4:
return new InsnNode(Opcodes.ICONST_4);
case 5:
return new InsnNode(Opcodes.ICONST_5);
}
if (i > -129 && i < 128) {
return new IntInsnNode(Opcodes.BIPUSH, i);
}
return new LdcInsnNode(i);
}
public static AbstractInsnNode getPushInstruction(int value) {
if (value == -1) {
return new InsnNode(Opcodes.ICONST_M1);
} else if (value == 0) {
return new InsnNode(Opcodes.ICONST_0);
} else if (value == 1) {
return new InsnNode(Opcodes.ICONST_1);
} else if (value == 2) {
return new InsnNode(Opcodes.ICONST_2);
} else if (value == 3) {
return new InsnNode(Opcodes.ICONST_3);
} else if (value == 4) {
return new InsnNode(Opcodes.ICONST_4);
} else if (value == 5) {
return new InsnNode(Opcodes.ICONST_5);
} else if ((value >= -128) && (value <= 127)) {
return new IntInsnNode(Opcodes.BIPUSH, value);
} else if ((value >= -32768) && (value <= 32767)) {
return new IntInsnNode(Opcodes.SIPUSH, value);
} else {
return new LdcInsnNode(value);
}
}
private InsnList createIsDebugList() {
boolean isUpper = RandomUtils.getRandomBoolean();
String argument = DEBUG_OPTIONS[debugOptionIndex.incrementAndGet() % DEBUG_OPTIONS.length];
if (isUpper)
argument = argument.toUpperCase();
else
argument = argument.toLowerCase();
InsnList insnList = new InsnList();
insnList.add(new MethodInsnNode(INVOKESTATIC, "java/lang/management/ManagementFactory", "getRuntimeMXBean", "()Ljava/lang/management/RuntimeMXBean;", false));
insnList.add(new MethodInsnNode(INVOKEINTERFACE, "java/lang/management/RuntimeMXBean", "getInputArguments", "()Ljava/util/List;", true));
insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;", false));
insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", isUpper ? "toUpperCase" : "toLowerCase", "()Ljava/lang/String;", false));
insnList.add(new LdcInsnNode(argument));
insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "contains", "(Ljava/lang/CharSequence;)Z", false));
return insnList;
}
@Override
public SourceValue newOperation(final AbstractInsnNode insn) {
int size;
switch (insn.getOpcode()) {
case LCONST_0:
case LCONST_1:
case DCONST_0:
case DCONST_1:
size = 2;
break;
case LDC:
Object value = ((LdcInsnNode) insn).cst;
size = value instanceof Long || value instanceof Double ? 2 : 1;
break;
case GETSTATIC:
size = Type.getType(((FieldInsnNode) insn).desc).getSize();
break;
default:
size = 1;
break;
}
return new SourceValue(size, insn);
}
@Override
public SourceValue newOperation(final AbstractInsnNode insn) {
int size;
switch (insn.getOpcode()) {
case LCONST_0:
case LCONST_1:
case DCONST_0:
case DCONST_1:
size = 2;
break;
case LDC:
Object cst = ((LdcInsnNode) insn).cst;
size = cst instanceof Long || cst instanceof Double ? 2 : 1;
break;
case GETSTATIC:
size = Type.getType(((FieldInsnNode) insn).desc).getSize();
break;
default:
size = 1;
}
return new SourceValue(size, insn);
}
public static AbstractInsnNode loadInt(int i) {
switch (i) {
case -1: return new InsnNode(ICONST_M1);
case 0: return new InsnNode(ICONST_0);
case 1: return new InsnNode(ICONST_1);
case 2: return new InsnNode(ICONST_2);
case 3: return new InsnNode(ICONST_3);
case 4: return new InsnNode(ICONST_4);
case 5: return new InsnNode(ICONST_5);
default: {
if (i >= Byte.MIN_VALUE && i <= Byte.MAX_VALUE) return new IntInsnNode(BIPUSH, i);
else if (i >= Short.MIN_VALUE && i <= Short.MAX_VALUE) return new IntInsnNode(SIPUSH, i);
else return new LdcInsnNode(i);
}
}
}
public static InsnList toNumericalValue(String what) {
Objects.requireNonNull(what);
InsnList il = new InsnList();
il.add(new LdcInsnNode(what));
il.add(new MethodInsnNode(
INVOKESTATIC,
Type.getInternalName(Conversions.class),
"toNumericalValue",
Type.getMethodDescriptor(
Type.getType(Number.class),
Type.getType(Object.class),
Type.getType(String.class)),
false));
return il;
}
public LoadIntStep() {
super((a) ->
{
if(!(a instanceof LdcInsnNode))
return true;
return ((LdcInsnNode)a).cst instanceof Integer;
},Opcodes.ICONST_M1,
Opcodes.ICONST_0,
Opcodes.ICONST_1,
Opcodes.ICONST_2,
Opcodes.ICONST_3,
Opcodes.ICONST_4,
Opcodes.ICONST_5,
Opcodes.LDC,
Opcodes.BIPUSH,
Opcodes.SIPUSH
);
}
private void convertLdcInsn(LdcInsnNode insn) {
Object val = insn.cst;
boolean dword = val instanceof Long || val instanceof Double;
StackFrame frame = getFrame(insn);
Operand[] out = frame.out();
Operand opr;
if (out == null) {
Value v = toSootValue(val);
opr = new Operand(insn, v);
frame.out(opr);
} else {
opr = out[0];
}
if (dword)
pushDual(opr);
else
push(opr);
}
private void addGetMethodInvocation(InsnList il) {
il.add(TreeInstructions.getPushInstruction(this.methodArguments.length));
il.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/Class"));
int parameterClassesIndex = getFistAvailablePosition();
il.add(new VarInsnNode(Opcodes.ASTORE, parameterClassesIndex));
this.mn.maxLocals++;
for (int i = 0; i < this.methodArguments.length; i++) {
il.add(new VarInsnNode(Opcodes.ALOAD, parameterClassesIndex));
il.add(TreeInstructions.getPushInstruction(i));
il.add(TreeInstructions.getClassReferenceInstruction(methodArguments[i], cn.version & 0xFFFF));
il.add(new InsnNode(Opcodes.AASTORE));
}
il.add(TreeInstructions.getClassConstantReference(this.classType, cn.version & 0xFFFF));
il.add(new LdcInsnNode(this.mn.name));
il.add(new VarInsnNode(Opcodes.ALOAD, parameterClassesIndex));
il.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
"org/brutusin/instrumentation/utils/Helper", "getSource",
"(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/Object;", false));
}
public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) {
if (node1.getOpcode() != node2.getOpcode()) {
return false;
}
switch (node2.getType()) {
case VAR_INSN:
return varInsnEqual((VarInsnNode) node1, (VarInsnNode) node2);
case TYPE_INSN:
return typeInsnEqual((TypeInsnNode) node1, (TypeInsnNode) node2);
case FIELD_INSN:
return fieldInsnEqual((FieldInsnNode) node1, (FieldInsnNode) node2);
case METHOD_INSN:
return methodInsnEqual((MethodInsnNode) node1, (MethodInsnNode) node2);
case LDC_INSN:
return ldcInsnEqual((LdcInsnNode) node1, (LdcInsnNode) node2);
case IINC_INSN:
return iincInsnEqual((IincInsnNode) node1, (IincInsnNode) node2);
case INT_INSN:
return intInsnEqual((IntInsnNode) node1, (IntInsnNode) node2);
default:
return true;
}
}
public static String toString(AbstractInsnNode ain) {
String s = getOpcodeText(ain.getOpcode());
switch (ain.getType()) {
case AbstractInsnNode.FIELD_INSN:
FieldInsnNode fin = (FieldInsnNode) ain;
return s + " " + fin.owner + "#" + fin.name + " " + fin.desc;
case AbstractInsnNode.METHOD_INSN:
MethodInsnNode min = (MethodInsnNode) ain;
return s + " " + min.owner + "#" + min.name + min.desc;
case AbstractInsnNode.VAR_INSN:
VarInsnNode vin = (VarInsnNode) ain;
return s + " " + vin.var;
case AbstractInsnNode.TYPE_INSN:
TypeInsnNode tin = (TypeInsnNode) ain;
return s + " " + tin.desc;
case AbstractInsnNode.MULTIANEWARRAY_INSN:
MultiANewArrayInsnNode mnin = (MultiANewArrayInsnNode) ain;
return s + " " + mnin.dims + " " + mnin.desc;
case AbstractInsnNode.JUMP_INSN:
JumpInsnNode jin = (JumpInsnNode) ain;
return s + " " + getIndex(jin.label);
case AbstractInsnNode.LDC_INSN:
LdcInsnNode ldc = (LdcInsnNode) ain;
return s + " " + ldc.cst.toString();
case AbstractInsnNode.INT_INSN:
return s + " " + getIntValue(ain);
case AbstractInsnNode.IINC_INSN:
IincInsnNode iinc = (IincInsnNode) ain;
return s + " " + iinc.var + " +" + iinc.incr;
case AbstractInsnNode.FRAME:
FrameNode fn = (FrameNode) ain;
return s + " " + getOpcodeText(fn.type) + " " + fn.local.size() + " " + fn.stack.size();
case AbstractInsnNode.LABEL:
LabelNode ln = (LabelNode) ain;
return s + " " + getIndex(ln);
}
return s;
}
private void ldcComponentUpdate(WebComboBox wcb, LdcInsnNode ain, Field f, WebTextField field) {
switch (wcb.getSelectedIndex()) {
case 0:
setField(f, ain, field.getText().trim());
break;
case 1:
setField(f, ain, Integer.parseInt(field.getText().trim()));
break;
case 2:
setField(f, ain, Float.parseFloat(field.getText().trim()));
break;
case 3:
setField(f, ain, Long.parseLong(field.getText().trim()));
break;
case 4:
setField(f, ain, Double.parseDouble(field.getText().trim()));
break;
case 5:
setField(f, ain, Type.getType(field.getText().trim()));
break;
case 6:
setField(f, ain, field.getText().trim());
break;
case 7:
setField(f, ain, field.getText().trim());
break;
}
}
static void optimize(MethodNode method) {
boolean found;
do {
found = false;
for (AbstractInsnNode insnNode : method.instructions.toArray()) {
if (insnNode instanceof MethodInsnNode) {
MethodInsnNode methodInsnNode = (MethodInsnNode) insnNode;
AbstractInsnNode prev = Utils.getPrevious(methodInsnNode, 1);
if (prev instanceof LdcInsnNode && ((LdcInsnNode) prev).cst instanceof String && (Utils.matchMethodNode(methodInsnNode, "java/lang/Object.hashCode:()I") || Utils.matchMethodNode(methodInsnNode, "java/lang/String.hashCode:()I"))) {
method.instructions.insert(insnNode, NodeUtils.generateIntPush(((LdcInsnNode) prev).cst.hashCode()));
method.instructions.remove(insnNode);
method.instructions.remove(prev);
found = true;
}
if (prev instanceof LdcInsnNode && ((LdcInsnNode) prev).cst instanceof String && (Utils.matchMethodNode(methodInsnNode, "java/lang/String.toUpperCase:()Ljava/lang/String;"))) {
method.instructions.insert(insnNode, new LdcInsnNode(((String) ((LdcInsnNode) prev).cst).toUpperCase()));
method.instructions.remove(insnNode);
method.instructions.remove(prev);
found = true;
}
if (prev instanceof LdcInsnNode && ((LdcInsnNode) prev).cst instanceof String && (Utils.matchMethodNode(methodInsnNode, "java/lang/String.toLowerCase:()Ljava/lang/String;"))) {
method.instructions.insert(insnNode, new LdcInsnNode(((String) ((LdcInsnNode) prev).cst).toLowerCase()));
method.instructions.remove(insnNode);
method.instructions.remove(prev);
found = true;
}
}
}
} while (found);
}
/**
* Translate a single {@link AbstractInsnNode} to an {@link InstructionFilter}.
* @param ain Instruction to convert.
* @return A filter an an equivilent to the inputted instruction.
*/
public static InstructionFilter translate(AbstractInsnNode ain) {
if (ain instanceof LdcInsnNode) {
return new LdcInstructionFilter(((LdcInsnNode) ain).cst);
} else if (ain instanceof TypeInsnNode) {
return new TypeInstructionFilter(ain.getOpcode(), ((TypeInsnNode) ain).desc);
} else if (ain instanceof FieldInsnNode) {
return new FieldInstructionFilter(ain.getOpcode(), ((FieldInsnNode) ain).owner, ((FieldInsnNode) ain).name, ((FieldInsnNode) ain).desc);
} else if (ain instanceof MethodInsnNode) {
return new MethodInstructionFilter(ain.getOpcode(), ((MethodInsnNode) ain).owner, ((MethodInsnNode) ain).name, ((MethodInsnNode) ain).desc);
} else if (ain instanceof VarInsnNode) {
return new VarInstructionFilter(ain.getOpcode(), ((VarInsnNode) ain).var);
} else if (ain instanceof InsnNode) {
return new InsnInstructionFilter(ain.getOpcode());
} else if (ain instanceof IincInsnNode) {
return new IincInstructionFilter(((IincInsnNode) ain).incr, ((IincInsnNode) ain).var);
} else if (ain instanceof JumpInsnNode) {
return new JumpInstructionFilter(ain.getOpcode());
} else if (ain instanceof LabelNode) {
return InstructionFilter.ACCEPT_ALL; // TODO: Cache labels and check. // TODO: That's a fucking stupid idea.
} else if (ain instanceof MultiANewArrayInsnNode) {
return new MultiANewArrayInstructionFilter(((MultiANewArrayInsnNode) ain).desc, ((MultiANewArrayInsnNode) ain).dims);
} else if(ain instanceof IntInsnNode) {
return new IntInstructionFilter((IntInsnNode) ain);
} else {
return InstructionFilter.ACCEPT_ALL;
}
}
@Override
public boolean accept(AbstractInsnNode t) {
if (!(t instanceof LdcInsnNode))
return false;
LdcInsnNode ldc = (LdcInsnNode) t;
return filter.accept(ldc.cst);
}
/**
* Get's a member's class types from its description. Best for methods.
*
* @param member
* @param map
* @return
*/
private static List<MappedClass> getTypesFromMember(MappedMember member, Map<String, MappedClass> map) {
List<String> names = RegexUtils.matchDescriptionClasses(member.getDesc());
if (member.isMethod()) {
for (AbstractInsnNode ain : member.getMethodNode().instructions.toArray()) {
if (ain.getType() == AbstractInsnNode.METHOD_INSN) {
MethodInsnNode min = (MethodInsnNode) ain;
names.addAll(RegexUtils.matchDescriptionClasses(min.desc));
names.add(min.owner);
} else if (ain.getType() == AbstractInsnNode.FIELD_INSN) {
FieldInsnNode fin = (FieldInsnNode) ain;
names.addAll(RegexUtils.matchDescriptionClasses(fin.desc));
names.add(fin.owner);
} else if (ain.getType() == AbstractInsnNode.TYPE_INSN) {
TypeInsnNode tin = (TypeInsnNode) ain;
names.addAll(RegexUtils.matchDescriptionClasses(tin.desc));
} else if (ain.getType() == AbstractInsnNode.LDC_INSN) {
LdcInsnNode ldc = (LdcInsnNode) ain;
if (ldc.cst instanceof Type) {
Type t = (Type) ldc.cst;
names.add(t.getClassName().replace(".", "/"));
}
}
}
}
if (names.size() == 0) {
return null;
}
List<MappedClass> classes = new ArrayList<MappedClass>();
for (String name : names) {
if (!map.containsKey(name)) {
continue;
}
classes.add(map.get(name));
}
return classes;
}
public static String toString(AbstractInsnNode ain) {
String s = getOpcodeText(ain.getOpcode());
switch (ain.getType()) {
case AbstractInsnNode.FIELD_INSN:
FieldInsnNode fin = (FieldInsnNode) ain;
return s + " " + fin.owner + "#" + fin.name + " " + fin.desc;
case AbstractInsnNode.METHOD_INSN:
MethodInsnNode min = (MethodInsnNode) ain;
return s + " " + min.owner + "#" + min.name + min.desc;
case AbstractInsnNode.VAR_INSN:
VarInsnNode vin = (VarInsnNode) ain;
return s + " " + vin.var;
case AbstractInsnNode.TYPE_INSN:
TypeInsnNode tin = (TypeInsnNode) ain;
return s + " " + tin.desc;
case AbstractInsnNode.JUMP_INSN:
JumpInsnNode jin = (JumpInsnNode) ain;
return s + " " + getIndex(jin.label);
case AbstractInsnNode.LDC_INSN:
LdcInsnNode ldc = (LdcInsnNode) ain;
return s + " " + ldc.cst.toString();
case AbstractInsnNode.INT_INSN:
return s + " " + getIntValue(ain);
case AbstractInsnNode.IINC_INSN:
IincInsnNode iinc = (IincInsnNode) ain;
return s + " " + iinc.var + " +" + iinc.incr;
case AbstractInsnNode.FRAME:
FrameNode fn = (FrameNode) ain;
return s + " " + getOpcodeText(fn.type) + " " + fn.local.size() + " " + fn.stack.size();
case AbstractInsnNode.LABEL:
LabelNode ln = (LabelNode) ain;
return s + " " + getIndex(ln);
}
return s;
}
public static boolean isNumber(AbstractInsnNode ain) {
if (ain.getOpcode() == BIPUSH || ain.getOpcode() == SIPUSH) {
return true;
}
if (ain.getOpcode() >= ICONST_M1 && ain.getOpcode() <= ICONST_5) {
return true;
}
if (ain instanceof LdcInsnNode) {
LdcInsnNode ldc = (LdcInsnNode) ain;
if (ldc.cst instanceof Number) {
return true;
}
}
return false;
}
public static AbstractInsnNode generateIntPush(int i) {
if (i <= 5 && i >= -1) {
return new InsnNode(i + 3); //iconst_i
}
if (i >= -128 && i <= 127) {
return new IntInsnNode(BIPUSH, i);
}
if (i >= -32768 && i <= 32767) {
return new IntInsnNode(SIPUSH, i);
}
return new LdcInsnNode(i);
}
public static int getIntValue(AbstractInsnNode node) {
if (node.getOpcode() >= ICONST_M1 && node.getOpcode() <= ICONST_5) {
return node.getOpcode() - 3;
}
if (node.getOpcode() == SIPUSH || node.getOpcode() == BIPUSH) {
return ((IntInsnNode) node).operand;
}
if(node instanceof LdcInsnNode) {
LdcInsnNode ldc = (LdcInsnNode) node;
return Integer.parseInt(ldc.cst.toString());
}
return 0;
}
public static String getStringValue(AbstractInsnNode node) {
if (node.getType() == AbstractInsnNode.LDC_INSN) {
LdcInsnNode ldc = (LdcInsnNode) node;
return ldc.cst.toString();
}
return "";
}
private void removeUnwantedCalls(InsnList decryption) {
// TODO remove unwanted methodinsnnodes
for (AbstractInsnNode ain : decryption.toArray()) {
if (ain.getOpcode() == INVOKEDYNAMIC) {
InvokeDynamicInsnNode idin = (InvokeDynamicInsnNode) ain;
if (idin.desc.equals("(IJ)Ljava/lang/String;")) {
decryption.insertBefore(idin, new InsnNode(POP2));
decryption.insert(idin, new LdcInsnNode("<clinit> decryption invokedynamic string undecrypted"));
decryption.set(idin, new InsnNode(POP));
}
}
}
}
public static boolean containsDESPadLDC(MethodNode clinit) {
for (AbstractInsnNode ain : clinit.instructions.toArray()) {
if (ain.getOpcode() == LDC) {
String cst = String.valueOf(((LdcInsnNode) ain).cst);
if (cst.equals("DES/CBC/PKCS5Padding")) {
return true;
}
}
}
return false;
}
private static boolean canProtect(InsnList insnList) {
return Stream.of(insnList.toArray()).noneMatch(insn -> insn.getOpcode() == INVOKEDYNAMIC
|| (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Handle)
|| insn instanceof MultiANewArrayInsnNode
|| insn instanceof LookupSwitchInsnNode
|| insn instanceof TableSwitchInsnNode);
}