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    }