1 19 20 package edu.umd.cs.findbugs.ba.bcp; 21 22 import org.apache.bcel.generic.ConstantPoolGen; 23 import org.apache.bcel.generic.FieldInstruction; 24 import org.apache.bcel.generic.Type; 25 26 import edu.umd.cs.findbugs.ba.DataflowAnalysisException; 27 import edu.umd.cs.findbugs.ba.vna.ValueNumber; 28 import edu.umd.cs.findbugs.ba.vna.ValueNumberFrame; 29 30 39 public abstract class FieldAccess extends SingleInstruction implements org.apache.bcel.Constants { 40 private String fieldVarName; 41 private String valueVarName; 42 43 49 public FieldAccess(String fieldVarName, String valueVarName) { 50 this.fieldVarName = fieldVarName; 51 this.valueVarName = valueVarName; 52 } 53 54 64 protected MatchResult checkConsistent(Variable field, Variable value, BindingSet bindingSet) { 65 bindingSet = addOrCheckDefinition(fieldVarName, field, bindingSet); 68 if (bindingSet == null) 69 return null; 70 bindingSet = addOrCheckDefinition(valueVarName, value, bindingSet); 71 if (bindingSet == null) 72 return null; 73 return new MatchResult(this, bindingSet); 74 } 75 76 82 protected static boolean isLongOrDouble(FieldInstruction fieldIns, ConstantPoolGen cpg) { 83 Type type = fieldIns.getFieldType(cpg); 84 int code = type.getType(); 85 return code == T_LONG || code == T_DOUBLE; 86 } 87 88 97 protected static Variable snarfFieldValue(FieldInstruction fieldIns, ConstantPoolGen cpg, ValueNumberFrame frame) 98 throws DataflowAnalysisException { 99 100 if (isLongOrDouble(fieldIns, cpg)) { 101 int numSlots = frame.getNumSlots(); 102 ValueNumber topValue = frame.getValue(numSlots - 1); 103 ValueNumber nextValue = frame.getValue(numSlots - 2); 104 return new LongOrDoubleLocalVariable(topValue, nextValue); 105 } else { 106 return new LocalVariable(frame.getTopValue()); 107 } 108 109 } 110 } 111 112 | Popular Tags |