001 package cpw.mods.fml.common.discovery.asm;
002
003 import java.util.LinkedList;
004
005 import org.objectweb.asm.Label;
006 import org.objectweb.asm.MethodVisitor;
007 import org.objectweb.asm.Opcodes;
008
009 import com.google.common.collect.Lists;
010
011 public class ModMethodVisitor extends MethodVisitor
012 {
013
014 private ASMModParser discoverer;
015 private boolean inCode;
016 private LinkedList<Label> labels = Lists.newLinkedList();
017 private String foundProperties;
018 private boolean validProperties;
019
020 public ModMethodVisitor(String name, ASMModParser discoverer)
021 {
022 super(Opcodes.ASM4);
023 this.discoverer = discoverer;
024 }
025 @Override
026 public void visitCode()
027 {
028 labels.clear();
029 }
030
031 @Override
032 public void visitLdcInsn(Object cst)
033 {
034 if (cst instanceof String && labels.size() == 1)
035 {
036 foundProperties = (String) cst;
037 }
038 }
039 @Override
040 public void visitInsn(int opcode)
041 {
042 if (Opcodes.ARETURN == opcode && labels.size() == 1 && foundProperties != null)
043 {
044 validProperties = true;
045 }
046 }
047 @Override
048 public void visitLabel(Label label)
049 {
050 labels.push(label);
051 }
052
053 @Override
054 public void visitEnd()
055 {
056 if (validProperties)
057 {
058 discoverer.setBaseModProperties(foundProperties);
059 }
060 }
061 }