001package serp.bytecode;
002
003import serp.bytecode.visitor.*;
004
005/**
006 * Stores a value from the stack into a field.
007 *
008 * @author Abe White
009 */
010public class PutFieldInstruction extends FieldInstruction {
011    PutFieldInstruction(Code owner, int opcode) {
012        super(owner, opcode);
013    }
014
015    public int getLogicalStackChange() {
016        if (getFieldTypeName() == null)
017            return 0;
018        if (getOpcode() == Constants.PUTSTATIC)
019            return -1;
020        return -2;
021    }
022
023    public int getStackChange() {
024        String type = getFieldTypeName();
025        if (type == null)
026            return 0;
027
028        int stack = -2;
029        if (long.class.getName().equals(type) 
030            || double.class.getName().equals(type))
031            stack++;
032        if (getOpcode() == Constants.PUTSTATIC)
033            stack++;
034        return stack;
035    }
036
037    public void acceptVisit(BCVisitor visit) {
038        visit.enterPutFieldInstruction(this);
039        visit.exitPutFieldInstruction(this);
040    }
041}