    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}