001    package serp.bytecode;
002    
003    import serp.bytecode.visitor.*;
004    
005    /**
006     * Stores a value from the stack into a field.
007     *
008     * @author Abe White
009     */
010    public 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    }