@NotNull
  @Override
  public Iterable<Instruction> successors(@NotNull CallEnvironment environment) {
    final Deque<CallInstruction> callStack = environment.callStack(this);
    if (callStack.isEmpty()) return Collections.emptyList();     //can be true in case env was not populated (e.g. by DFA)

    final CallInstruction callInstruction = callStack.peek();
    final Iterable<Instruction> successors = callInstruction.allSuccessors();
    final Deque<CallInstruction> copy = new ArrayDeque<>(callStack);
    copy.pop();
    for (Instruction instruction : successors) {
      environment.update(copy, instruction);
    }

    return successors;
  }
@NotNull
  @Override
  public Iterable<Instruction> successors(@NotNull CallEnvironment environment)