1 19 package edu.umd.cs.findbugs.ba.constant; 20 21 import org.apache.bcel.generic.BIPUSH; 22 import org.apache.bcel.generic.ConstantPoolGen; 23 import org.apache.bcel.generic.ICONST; 24 import org.apache.bcel.generic.IINC; 25 import org.apache.bcel.generic.LDC; 26 import org.apache.bcel.generic.LDC2_W; 27 import org.apache.bcel.generic.SIPUSH; 28 29 import edu.umd.cs.findbugs.ba.AbstractFrameModelingVisitor; 30 31 41 public class ConstantFrameModelingVisitor 42 extends AbstractFrameModelingVisitor<Constant, ConstantFrame> { 43 44 public ConstantFrameModelingVisitor(ConstantPoolGen cpg) { 45 super(cpg); 46 } 47 48 @Override 49 public Constant getDefaultValue() { 50 return Constant.NOT_CONSTANT; 51 } 52 @Override 53 public void visitIINC(IINC obj) { 54 int v = obj.getIndex(); 56 int amount = obj.getIncrement(); 57 ConstantFrame f = getFrame(); 58 Constant c = f.getValue(v); 59 if (c.isConstantInteger()) 60 f.setValue(v, new Constant(c.getConstantInt() + amount)); 61 else f.setValue(v, Constant.NOT_CONSTANT); 62 } 64 65 @Override 66 public void visitICONST(ICONST obj) { 67 Number value = obj.getValue(); 68 Constant c = new Constant(value); 69 getFrame().pushValue(c); 70 } 71 72 73 @Override 74 public void visitBIPUSH(BIPUSH obj) { 75 Number value = obj.getValue(); 76 Constant c = new Constant(value); 77 getFrame().pushValue(c); 78 } 79 80 @Override 81 public void visitSIPUSH(SIPUSH obj) { 82 Number value = obj.getValue(); 83 Constant c = new Constant(value); 84 getFrame().pushValue(c); 85 } 86 87 88 @Override 89 public void visitLDC(LDC obj) { 90 Object value = obj.getValue(getCPG()); 91 Constant c = new Constant(value); 92 getFrame().pushValue(c); 93 } 94 95 @Override 96 public void visitLDC2_W(LDC2_W obj) { 97 Object value = obj.getValue(getCPG()); 98 Constant c = new Constant(value); 99 getFrame().pushValue(c); 100 getFrame().pushValue(c); 101 } 102 103 } 104 | Popular Tags |