001package cpw.mods.fml.common.discovery.asm;
002
003import java.util.LinkedList;
004
005import org.objectweb.asm.Label;
006import org.objectweb.asm.MethodVisitor;
007import org.objectweb.asm.Opcodes;
008
009import com.google.common.collect.Lists;
010
011public 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}