/**
  * Checks whether the given statement is the end of an implicit flow. If this is the case, then
  * the corresponding if statement which is the start of this implicit flow will be removed from
  * the program counter in the outgoing locals map. Note, that the method will not change the
  * incoming locals map.
  *
  * @param statement Statement for which should be checked whether it is the end of an implicit
  *     flow.
  * @param in Current incoming map of the local variables.
  * @param out Current outgoing map of the local variables.
  */
 private void checkEndOfImplicitFlow(Stmt statement, LocalsMap in, LocalsMap out) {
   List<IfStmt> ifStmts = new ArrayList<IfStmt>(in.getProgramCounter().keySet());
   for (IfStmt ifStmt : ifStmts) {
     if (getContainer().postDomSetOfStmtContainsS(ifStmt, statement)) {
       out.removeProgramCounterLevel(ifStmt);
     }
   }
 }
 /**
  * Compute the merge of the <code>in1</code> and <code>in2</code> locals maps, putting the result
  * into <code>out</code>. The behavior of this function is that the strongest <em>security
  * level</em> which exists for a local variable in <code>in1</code> or <code>in2</code>, is taken
  * for the <code>out</code> locals map. Used by the {@link SecurityLevelAnalysis#doAnalysis()}
  * method.
  *
  * @param in1 First locals map that should be merged together with the second map.
  * @param in2 Second locals map that should be merged together with the first map.
  * @param out Outgoing locals map that should store the result of the merge of <code>in1</code>
  *     and <code>in2</code>.
  * @see soot.toolkits.scalar.AbstractFlowAnalysis#merge(java.lang.Object, java.lang.Object,
  *     java.lang.Object)
  */
 @Override
 protected void merge(LocalsMap in1, LocalsMap in2, LocalsMap out) {
   copy(in1, out);
   out.addAllStronger(in2.getExtendedLocals());
 }
 /**
  * Creates a copy of the <code>source</code> flow object, i.e. the locals map, in <code>dest
  * </code>.
  *
  * @param source The locals map that should be copied in the given outgoing map.
  * @param dest The locals map in which the state of the first given locals map should be copied.
  * @see soot.toolkits.scalar.AbstractFlowAnalysis#copy(java.lang.Object, java.lang.Object)
  */
 @Override
 protected void copy(LocalsMap source, LocalsMap dest) {
   dest.clear();
   dest.addAll(source.getExtendedLocals(), source.getProgramCounter());
 }