下面列出了org.objectweb.asm.tree.AbstractInsnNode#LABEL 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Returns the previous instruction prior to the given node, ignoring label
* and line number nodes.
*
* @param node the node to look up the previous instruction for
* @return the previous instruction, or null if no previous node was found
*/
@Nullable
public static AbstractInsnNode getPrevInstruction(@NonNull AbstractInsnNode node) {
AbstractInsnNode prev = node;
while (true) {
prev = prev.getPrevious();
if (prev == null) {
return null;
} else {
int type = prev.getType();
if (type != AbstractInsnNode.LINE && type != AbstractInsnNode.LABEL
&& type != AbstractInsnNode.FRAME) {
return prev;
}
}
}
}
/**
* Returns the next instruction after to the given node, ignoring label and
* line number nodes.
*
* @param node the node to look up the next node for
* @return the next instruction, or null if no next node was found
*/
@Nullable
public static AbstractInsnNode getNextInstruction(@NonNull AbstractInsnNode node) {
AbstractInsnNode next = node;
while (true) {
next = next.getNext();
if (next == null) {
return null;
} else {
int type = next.getType();
if (type != AbstractInsnNode.LINE && type != AbstractInsnNode.LABEL
&& type != AbstractInsnNode.FRAME) {
return next;
}
}
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void removeDeadCode(ClassNode cn, MethodNode mn) {
Analyzer analyzer = new Analyzer(new BasicInterpreter());
try {
analyzer.analyze(cn.name, mn);
} catch (AnalyzerException e) {
ErrorDisplay.error("Could not analyze the code: " + e.getMessage());
return;
}
Frame[] frames = analyzer.getFrames();
AbstractInsnNode[] insns = mn.instructions.toArray();
for (int i = 0; i < frames.length; i++) {
AbstractInsnNode insn = insns[i];
if (frames[i] == null && insn.getType() != AbstractInsnNode.LABEL) {
mn.instructions.remove(insn);
insns[i] = null;
}
}
}
@Override
public void process(@Nonnull final ParserClassNode classNode,
@Nonnull final RuleMethod method)
throws Exception
{
Objects.requireNonNull(classNode, "classNode");
Objects.requireNonNull(method, "method");
AbstractInsnNode current = method.instructions.getFirst();
AbstractInsnNode next;
boolean doRemove;
while (current != null) {
next = current.getNext();
//noinspection SuspiciousMethodCalls
doRemove = current.getType() == AbstractInsnNode.LABEL
&& !method.getUsedLabels().contains(current);
if (doRemove)
method.instructions.remove(current);
current = next;
}
}
@Override
protected void newControlFlowEdge(int insnIndex, int successorIndex) {
AssignmentTrackingFrame<V> oldFrame = (AssignmentTrackingFrame<V>) getFrames()[insnIndex];
AbstractInsnNode insn = insnList.get(insnIndex);
if (insn.getType() == AbstractInsnNode.LABEL) {
// checks whether current label corresponds to the end of conditional block to restore previous
// local variables set
if (insn.equals(oldFrame.labelsStack.peekFirst())) {
oldFrame.localVariablesSet.pop();
oldFrame.labelsStack.pop();
}
}
}
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 static int labelIndex(LabelNode label) {
int i = 0;
AbstractInsnNode ain = label.getPrevious();
while (ain != null) {
if (ain.getType() == AbstractInsnNode.LABEL) {
i++;
}
ain = ain.getPrevious();
}
return i;
}
private boolean isJumpBlock(Block b) {
for (AbstractInsnNode ain : b.getNodes()) {
int type = ain.getType();
if (type != AbstractInsnNode.LABEL && type != AbstractInsnNode.LINE && type != AbstractInsnNode.FRAME && type != AbstractInsnNode.JUMP_INSN) {
return false;
}
}
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.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 boolean isJumpBlock(Block b) {
for (AbstractInsnNode ain : b.getNodes()) {
int type = ain.getType();
if (type != AbstractInsnNode.LABEL && type != AbstractInsnNode.LINE && type != AbstractInsnNode.FRAME && type != AbstractInsnNode.JUMP_INSN) {
return false;
}
}
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;
}
public static String toString(AbstractInsnNode ain) {
String opc = TextUtils.toBold(OpUtils.getOpcodeText(ain.getOpcode()).toLowerCase()) + " ";
switch (ain.getType()) {
case AbstractInsnNode.LABEL:
opc = TextUtils.toLight("label " + OpUtils.getLabelIndex((LabelNode) ain));
break;
case AbstractInsnNode.LINE:
opc = TextUtils.toLight("line " + ((LineNumberNode) ain).line);
break;
case AbstractInsnNode.FIELD_INSN:
FieldInsnNode fin = (FieldInsnNode) ain;
opc += getDisplayType(TextUtils.escape(fin.desc), true) + " " + getDisplayClassRed(TextUtils.escape(fin.owner))
+ "." + fin.name;
break;
case AbstractInsnNode.METHOD_INSN:
MethodInsnNode min = (MethodInsnNode) ain;
if (min.desc.contains(")")) {
opc += getDisplayType(min.desc.split("\\)")[1], true);
} else {
opc += min.desc;
}
opc += " " + getDisplayClassRed(TextUtils.escape(min.owner)) + "." + TextUtils.escape(min.name) + "("
+ getDisplayArgs(TextUtils.escape(min.desc)) + ")";
break;
case AbstractInsnNode.VAR_INSN:
VarInsnNode vin = (VarInsnNode) ain;
opc += vin.var;
break;
case AbstractInsnNode.TYPE_INSN:
TypeInsnNode tin = (TypeInsnNode) ain;
String esc = TextUtils.escape(tin.desc);
if (esc.endsWith(";") && esc.startsWith("L")) {
opc += TextUtils.addTag(esc, "font color=" + primColor.getString());
} else {
opc += getDisplayClass(esc);
}
break;
case AbstractInsnNode.MULTIANEWARRAY_INSN:
MultiANewArrayInsnNode mnin = (MultiANewArrayInsnNode) ain;
opc += mnin.dims + " " + getDisplayType(TextUtils.escape(mnin.desc), true);
break;
case AbstractInsnNode.JUMP_INSN:
JumpInsnNode jin = (JumpInsnNode) ain;
opc += OpUtils.getLabelIndex(jin.label);
break;
case AbstractInsnNode.LDC_INSN:
LdcInsnNode ldc = (LdcInsnNode) ain;
opc += TextUtils.addTag(ldc.cst.getClass().getSimpleName(), "font color=" + primColor.getString()) + " ";
if (ldc.cst instanceof String)
opc += TextUtils.addTag("\"" + TextUtils.escape(ldc.cst.toString()) + "\"", "font color=#559955");
else {
opc += ldc.cst.toString();
}
break;
case AbstractInsnNode.INT_INSN:
opc += OpUtils.getIntValue(ain);
break;
case AbstractInsnNode.IINC_INSN:
IincInsnNode iinc = (IincInsnNode) ain;
opc += iinc.var + " " + iinc.incr;
break;
case AbstractInsnNode.FRAME:
FrameNode fn = (FrameNode) ain;
opc = TextUtils
.toLight(OpUtils.getFrameType(fn.type).toLowerCase() + " " + fn.local.size() + " " + fn.stack.size());
break;
case AbstractInsnNode.TABLESWITCH_INSN:
TableSwitchInsnNode tsin = (TableSwitchInsnNode) ain;
if (tsin.dflt != null) {
opc += TextUtils.addTag("L" + OpUtils.getLabelIndex(tsin.dflt), "font color=" + secColor.getString());
}
if (tsin.labels.size() < 20) {
for (LabelNode l : tsin.labels) {
opc += " " + TextUtils.addTag("L" + OpUtils.getLabelIndex(l), "font color=" + primColor.getString());
}
} else {
opc += " " + TextUtils.addTag(tsin.labels.size() + " cases", "font color=" + primColor.getString());
}
break;
case AbstractInsnNode.INVOKE_DYNAMIC_INSN:
InvokeDynamicInsnNode idin = (InvokeDynamicInsnNode) ain;
Object[] arr = idin.bsmArgs;
if (arr.length > 1) {
Object o = arr[1];
if (o instanceof Handle) {
Handle h = (Handle) o;
opc += getDisplayType(h.getDesc().split("\\)")[1], true) + " "
+ getDisplayClassRed(TextUtils.escape(h.getOwner())) + "." + TextUtils.escape(h.getName()) + "("
+ getDisplayArgs(TextUtils.escape(h.getDesc())) + ")";
}
} else {
opc += TextUtils.addTag(TextUtils.escape(idin.name), "font color=" + primColor.getString()) + " "
+ TextUtils.escape(idin.desc);
}
break;
}
return opc;
}
public static String toEasyString(AbstractInsnNode ain) {
String opc = OpUtils.getOpcodeText(ain.getOpcode()).toLowerCase() + " ";
switch (ain.getType()) {
case AbstractInsnNode.LABEL:
opc = "label " + OpUtils.getLabelIndex((LabelNode) ain);
break;
case AbstractInsnNode.LINE:
opc = "line " + ((LineNumberNode) ain).line;
break;
case AbstractInsnNode.FIELD_INSN:
FieldInsnNode fin = (FieldInsnNode) ain;
opc += getDisplayType(fin.desc, false) + " " + getDisplayClassEasy(fin.owner) + "." + fin.name;
break;
case AbstractInsnNode.METHOD_INSN:
MethodInsnNode min = (MethodInsnNode) ain;
opc += getDisplayType(min.desc.split("\\)")[1], false) + " " + getDisplayClassEasy(min.owner) + "." + min.name
+ "(" + getDisplayArgsEasy(min.desc) + ")";
break;
case AbstractInsnNode.VAR_INSN:
VarInsnNode vin = (VarInsnNode) ain;
opc += vin.var;
break;
case AbstractInsnNode.MULTIANEWARRAY_INSN:
MultiANewArrayInsnNode mnin = (MultiANewArrayInsnNode) ain;
opc += mnin.dims + " " + getDisplayType(mnin.desc, false);
break;
case AbstractInsnNode.TYPE_INSN:
TypeInsnNode tin = (TypeInsnNode) ain;
String esc = tin.desc;
if (esc.endsWith(";") && esc.startsWith("L")) {
opc += esc;
} else {
opc += getDisplayClassEasy(esc);
}
break;
case AbstractInsnNode.JUMP_INSN:
JumpInsnNode jin = (JumpInsnNode) ain;
opc += OpUtils.getLabelIndex(jin.label);
break;
case AbstractInsnNode.LDC_INSN:
LdcInsnNode ldc = (LdcInsnNode) ain;
opc += ldc.cst.getClass().getSimpleName() + " ";
if (ldc.cst instanceof String)
opc += "\"" + ldc.cst.toString() + "\"";
else {
opc += ldc.cst.toString();
}
break;
case AbstractInsnNode.INT_INSN:
opc += OpUtils.getIntValue(ain);
break;
case AbstractInsnNode.IINC_INSN:
IincInsnNode iinc = (IincInsnNode) ain;
opc += iinc.var + " " + iinc.incr;
break;
case AbstractInsnNode.FRAME:
FrameNode fn = (FrameNode) ain;
opc = OpUtils.getOpcodeText(fn.type).toLowerCase() + " " + fn.local.size() + " " + fn.stack.size();
break;
case AbstractInsnNode.TABLESWITCH_INSN:
TableSwitchInsnNode tsin = (TableSwitchInsnNode) ain;
if (tsin.dflt != null) {
opc += "L" + OpUtils.getLabelIndex(tsin.dflt);
}
if (tsin.labels.size() < 20) {
for (LabelNode l : tsin.labels) {
opc += " " + "L" + OpUtils.getLabelIndex(l);
}
} else {
opc += " " + tsin.labels.size() + " cases";
}
break;
case AbstractInsnNode.INVOKE_DYNAMIC_INSN:
InvokeDynamicInsnNode idin = (InvokeDynamicInsnNode) ain;
opc += idin.name + " " + idin.desc;
break;
}
return opc;
}
private static boolean isLabelOrJump(final AbstractInsnNode node)
{
return node.getType() == AbstractInsnNode.LABEL
|| node.getType() == AbstractInsnNode.JUMP_INSN;
}