'Computes the dag runs and their respective task instances for
the given run dates and executes the task instances.
Returns a list of execution dates of the dag runs that were executed.
:param run_dates: Execution dates for dag runs
:type run_dates: list
:param ti_status: internal BackfillJob status structure to tis track progress
:type ti_status: BackfillJob._DagRunTaskStatus
:param executor: the executor to use, it must be previously started
:type executor: BaseExecutor
:param pickle_id: numeric id of the pickled dag, None if not pickled
:type pickle_id: int
:param start_date: backfill start date
:type start_date: datetime
:param session: the current session object
:type session: Session'

@provide_session
def _execute_for_run_dates(self, run_dates, ti_status, executor, pickle_id, start_date, session=None):

    for next_run_date in run_dates:
        dag_run = self._get_dag_run(next_run_date, session=session)
        tis_map = self._task_instances_for_dag_run(dag_run, session=session)
        if (dag_run is None):
            continue
        ti_status.active_runs.append(dag_run)
        ti_status.to_run.update((tis_map or {}))
    processed_dag_run_dates = self._process_backfill_task_instances(ti_status=ti_status, executor=executor, pickle_id=pickle_id, start_date=start_date, session=session)
    ti_status.executed_dag_run_dates.update(processed_dag_run_dates)
