| 1 19 20 package edu.umd.cs.findbugs.ba; 21 22 import java.util.BitSet ; 23 import java.util.HashMap ; 24 25 import org.apache.bcel.Constants; 26 import org.apache.bcel.classfile.Method; 27 28 import edu.umd.cs.findbugs.ba.vna.ValueNumber; 29 import edu.umd.cs.findbugs.ba.vna.ValueNumberDataflow; 30 31 46 public class LockChecker { 47 private ClassContext classContext; 48 private Method method; 49 private LockDataflow lockDataflow; 50 private ValueNumberDataflow vnaDataflow; 51 private HashMap <Location, LockSet> cache; 52 53 59 public LockChecker(ClassContext classContext, Method method) { 60 this.classContext = classContext; 61 this.method = method; 62 this.cache = new HashMap <Location, LockSet>(); 63 } 64 65 71 public void execute() throws DataflowAnalysisException, CFGBuilderException { 72 BitSet bytecodeSet = classContext.getBytecodeSet(method); 73 if (bytecodeSet == null) return; 74 if (bytecodeSet.get(Constants.MONITORENTER) || bytecodeSet.get(Constants.MONITOREXIT)) { 75 this.lockDataflow = classContext.getLockDataflow(method); 76 } else if (method.isSynchronized()) { 77 this.vnaDataflow = classContext.getValueNumberDataflow(method); } 79 } 80 81 88 public LockSet getFactAtLocation(Location location) throws DataflowAnalysisException { 89 if (lockDataflow != null) 90 return lockDataflow.getFactAtLocation(location); 91 else { 92 LockSet lockSet = cache.get(location); 93 if (lockSet == null) { 94 lockSet = new LockSet(); 95 lockSet.setDefaultLockCount(0); 96 if (method.isSynchronized() && !method.isStatic()) { 97 ValueNumber instance = vnaDataflow.getAnalysis().getThisValue(); 99 lockSet.setLockCount(instance.getNumber(), 1); 100 } else { 101 } 103 cache.put(location, lockSet); 104 } 105 return lockSet; 106 } 107 } 108 } 109 | Popular Tags |